Предотвратить изменение сетки данных Silverlight при нажатии кнопки убийства? - PullRequest
1 голос
/ 11 апреля 2011

У меня есть сетка данных в Silverlight, в которой есть столбец шаблона, содержащий кнопку.В XAML выглядит примерно так:

<sdk:DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding Selected, Mode=TwoWay}">
            <sdk:DataGrid.Columns>
                <sdk:DataGridTemplateColumn>
                    <sdk:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button HorizontalAlignment="Right" Click="btn_Click">
                                <StackPanel Orientation="Horizontal">
                                    <Image Source="/image.png"/>
                                </StackPanel>
                            </Button>
                        </DataTemplate>
                    </sdk:DataGridTemplateColumn.CellTemplate>
                </sdk:DataGridTemplateColumn>
                <!-- Ten Other Columns -->
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>

Теперь в этой настройке событие btn_Click срабатывает нормально при каждом нажатии этой кнопки (независимо от того, выбрана ли строка. Все хорошо, пока я не добавилСобытие selectionchanged для сетки данных. Первая строка XAML теперь такова -

<sdk:DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding Selected, Mode=TwoWay}" SelectionChanged="dg_SelectionChanged">

Теперь событие btn_Click будет срабатывать только в том случае, если кнопка, по которой вы щелкнули, находится в текущей выбранной строке.только, и никогда не доходит до нажатия кнопки. Выстрел события, измененного выбором, я понимаю, потому что вы, очевидно, переключаете выбранную строку. Но я не понимаю, почему btn_Click никогда не срабатывает. У всех есть идеи о том, почему и какчтобы обойти это?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Возможно, вы подумали, что событие Button.Click никогда не сработает, потому что вы установили точки останова в обработчиках событий btn_Click и dg_SelectionChanged. В этом случае отладчик входит в dg_SelectionChanged и никогда в btn_Click. Но если вы добавите TextBlock в свое представление и добавите что-то вроде этого:

        private void btn_Click(object sender, RoutedEventArgs e)
        {
            textBlock.Text += "Button.Click ";
        }

        private void dg_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            textBlock.Text += "DataGrid.SelectionChanged ";
        }

Вы можете видеть, что оба события возникают нормально.

0 голосов
/ 13 апреля 2011

Я выяснил, в чем проблема.У меня был индикатор занятости инструментария Silverlight, который оборачивал эту сетку (а также содержит сетку макета).В событии SelectionChanged я переключил свойство IsBusy индикатора занятости в значение true.Очевидно, это вызывает все события, которые сработали бы под этим индикатором занятости, чтобы отменить (включая мой btn_Click) событие.Итак, чтобы ответить на мой вопрос: SelectionChanged не уничтожил событие, он вызывал индикатор занятости изнутри события selectedloc, которое убило btn_Click.

...