我在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永远不会被击中。任何人都有关于为什么会这样做以及如何绕过它的想法?
提前致谢。
答案 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。