通过终止按钮点击阻止Silverlight数据网格选择?

时间:2011-04-11 16:30:38

标签: silverlight datagrid selectionchanged

我在Silverlight中有一个datagrid,其中包含一个包含按钮的模板列。看起来在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事件就会触发(无论是否选中该行。一切都很好,直到我向datagrid添加了一个selectionchanged事件.XAML的第一行现在是这个 -

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

现在只有当点击的按钮位于当前选定的行上时,才会触发btn_Click事件。否则它只触发selectionchanged事件,永远不会点击按钮。我明白了selectionchanged事件触发,因为你显然是在切换选定的行。但我不明白为什么btn_Click永远不会被击中。任何人都有关于为什么会这样做以及如何绕过它的想法?

提前致谢。

2 个答案:

答案 0 :(得分: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 ";
        }

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

答案 1 :(得分:0)

我发现了问题所在。我有一个Silverlight工具包忙指示器包裹这个网格(以及它包含布局网格)。在SelectionChanged事件中,我将忙指示符IsBusy属性切换为true。显然,这会导致在忙碌指示符下面触发的所有事件都被取消(包括我的btn_Click)事件。所以,回答我的问题:SelectionChanged没有杀死事件,它是在selectchanged事件中调用busy指示符来杀死btn_Click。