2011-04-11 76 views
1

我有一个Silverlight中的数据网格,其中包含一个按钮的模板列。在XAML基本上是这样的 - 现在防止Silverlight的datagrid选择从点击按钮点击改变?

<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事件。到DataGrid XAML的第一行现在是这样的 -

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

现在btn_Click事件将仅被点击的按钮是当前选中的行。否则只触发SelectionChanged事件,永不火灾。得到按钮点击。我知道selectionchanged事件触发,因为你显然在切换选中的行我不明白的是为什么btn_Click从未被击中。任何人都有想法,为什么这是以及如何解决它?

在此先感谢。

回答

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 "; 
     } 

你可以看到,这两个事件提高罚款。

+0

谢谢。这并不是我们的问题,但是一旦我弄清楚了问题所在,这很有帮助,因为我遇到了这个问题。 – Spencer 2011-04-13 12:35:37

0

我发现问题是什么。我有一个Silverlight工具包繁忙指标正在包装这个网格(以及它包含布局网格)。在SelectionChanged事件中,我将忙指标IsBusy属性切换为true。显然这会导致在忙指示符下面触发的所有事件取消(包括我的btn_Click)事件。因此,要回答我的问题:SelectionChanged没有终止事件,它正在调用占用btn_Click的selectionchanged事件中的忙指示符。