日前在重写datagrid的控件,期望实现datagridrow的IsSelected的事件绑定到Checkbox的isCheck上。也就是当前行的checkbox选中时,当前行的isSelected置成true。
一般做法是使用mvvm,即构建一个模型,实现INotifyPropertyChanged,里面有一个属性是用来绑定选中的。
但是现在不想用这种方式,想把拿到的数据源 不管任何数据,直接绑定到表格上。所以,把当前行的checkbox绑定在了datagridrow的isSelected属性上。这样选中事件,其实是独立于数据源的。
把checkbox的ischeck的属性单向绑定在了datagridrow的IsSelected的属性之后,发现checkbox的checked事件,需要手动设置当前行为选中状态。查找资料后发现,可以通过这种方式设置:
DataGridRow _row = (DataGridRow)datagrid.ItemContainerGenerator.ContainerFromIndex(index);
if (_row == null)
{
//datagrid.UpdateLayout();
//_row = (DataGridRow)datagrid.ItemContainerGenerator.ContainerFromIndex(index);
//if(_row == null)
//{
// return;
//}
return;
}
_row.IsSelected = value;
这样可以通过索引,来确定当前是哪一行。但是这样有一个缺陷,就是当
datagrid.EnableRowVirtualization = true
时,没有展现在视觉里的行,其实并未加载。那么也就取不到使用的datagridrow。但是如果不开启虚拟加载,datagrid会把当前所有数据加载出来,数据量大时会卡顿。
查找资料后发现。datagrid继承MultiSelector,而MultiSelector中的SelectedItems实际就是用来记录选中项的。那么是不是把需要选中的行的数据源对象,加到SelectedItems中,就可以设置选中了。测试后果然如此。
这样的话,其实只需要把需要设置为选中的数据,提前加到SelectedItems,表格展示时,会自动设置选中样式。
但是这种方法适用于表格展示数据量有限的情况。数据量较大的话,建议还是使用mvvm绑定的方法