2009-11-26 92 views
7

我有一个包含复选框的列的数据网格。我想改变装订选属性的值被点击行时:Silverlight Datagrid行点击

alt text http://lh4.ggpht.com/_L9TmtwXFtew/Sw6YtzRWGEI/AAAAAAAAGlQ/pntIr2GU6Mo/image_thumb%5B3%5D.png

注意:我不想用SelectedItemChanged事件,因为这并不能正常工作,只有一个时在网格中排。

+0

您想要再次点击该行时切换吗?点击行中是否有任何地方不应该有这种效果? – AnthonyWJones 2009-11-26 16:28:15

回答

7

由于经常是我发现我自己的解决方案,这种方式:

添加的MouseLeftButtonUp事件到DataGrid:

<data:DataGrid x:Name="dgTaskLinks" 
ItemsSource="{Binding TaskLinks}" 
SelectedItem="{Binding SelectedTaskLink, Mode=TwoWay}" 
MouseLeftButtonUp="dgTaskLinks_MouseLeftButtonUp" 
>... 

而且walk the visual tree获取数据网格行:

private void dgTaskLinks_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
      { 
       ///get the clicked row 
       DataGridRow row = MyDependencyObjectHelper.FindParentOfType<DataGridRow>(e.OriginalSource as DependencyObject); 

       ///get the data object of the row 
       if (row != null && row.DataContext is TaskLink) 
       { 
        ///toggle the IsSelected value 
        (row.DataContext as TaskLink).IsSelected = !(row.DataContext as TaskLink).IsSelected; 
       } 

      } 

一旦找到,它是一个简单的方法来切换绑定的IsSelected属性:-)

希望这可以帮助别人。

+0

我喜欢你的解决方案。它比我的更有意义。虽然,我想知道你从哪里得到这个'MyDependencyObjectHelper'类。我假设你的自定义代码。小心分享它? – 2010-02-25 06:36:09

+0

它在“漫游视觉树”下的答案中链接。 GLad帮助,Mark – 2010-02-26 07:32:38

+0

+1伟大的解决方案!我花了3个小时试图破解一个网格来“自动选择”一个复选框,并没有提出任何接近优雅的东西。 – 2010-04-01 20:38:07

0

这里有一个更简单的解决方案

XAML

<data:DataGrid 
x:Name="dgMyDataGrid" 
ItemsSource="{Binding MyList}" 
SelectedItem="{Binding MyList, Mode=TwoWay}" 
MouseLeftButtonUp="dgMyDataGrid_MouseLeftButtonUp">... 

CS

private void dgMyDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    DataGrid dg = (sender as DataGrid); 
    var allObjects = dg.DataContext as List<MyCustomObject>; 
    foreach(var o in allObjects) 
    { 
      o.Selected = false; 
    } 

    MyCustomObject SelectedObject = (MyCustomObject)dg.SelectedItem; 
    SelectedObject.Selected = true; 
} 

注:这个问题,以及其他的例子假设你的类所绑定的控件实现INotifyPropertyChanged