【发布时间】:2010-12-20 17:24:08
【问题描述】:
我有一个数据网格,其中有一列包含一个复选框。单击该行时,我想更改绑定的 Selected 属性的值:
注意:我不想使用 SelectedItemChanged 事件,因为当网格中只有一行时它不能正常工作。
【问题讨论】:
-
是否要在再次单击该行时进行切换?行中是否有任何点击不应该产生这种效果的地方?
标签: silverlight datagrid
我有一个数据网格,其中有一列包含一个复选框。单击该行时,我想更改绑定的 Selected 属性的值:
注意:我不想使用 SelectedItemChanged 事件,因为当网格中只有一行时它不能正常工作。
【问题讨论】:
标签: silverlight datagrid
我通常是这样找到自己的解决方案的:
向数据网格添加 MouseLeftButtonUp 事件:
<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 属性的简单方法 :-)
希望这对其他人有所帮助。
【讨论】:
这是一个更简单的解决方案
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
【讨论】: