1

我在 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 事件只会在被点击的按钮位于当前选定的行时触发。否则它只会触发 selectionchanged 事件,并且永远不会点击按钮。我理解 selectionchanged 事件触发,因为您显然正在切换选定的行。但我不明白为什么 btn_Click 永远不会被击中。任何人都知道为什么会这样以及如何解决它?

提前致谢。

4

2 回答 2

1

也许您认为 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 ";
        }

你可以看到这两个事件都很好。

于 2011-04-11T17:21:03.687 回答
0

我发现了问题所在。我有一个 Silverlight 工具包繁忙指示器,它包装了这个网格(以及它包含布局网格)。在 SelectionChanged 事件中,我将忙碌指示器 IsBusy 属性切换为 true。显然,这会导致在该繁忙指示器下触发的所有事件都取消(包括我的 btn_Click)事件。所以,回答我的问题:SelectionChanged 没有终止事件,它是从终止 btn_Click 的 selectionchanged 事件内部调用繁忙指示器。

于 2011-04-13T12:39:36.837 回答