我有以下方法来选择数据网格中的所有复选框:
private void CheckboxSelectAll(int column)
{
for (int i = 0; i < twn; i++)
{
var row = (DataGridRow)dGrid.ItemContainerGenerator.ContainerFromIndex(i);
if (row == null) continue;
var chk = (System.Windows.Controls.CheckBox)dGrid.Columns[column].GetCellContent(row);
chk.IsChecked = true;
}
}
只有所有列都在视图中时,这才有效。例如,如果复选框的数量超过数据网格的高度,则不会选择它们。我将不得不向下滚动,将它们暴露给视图,然后重新调用我的方法以最终选择剩余的复选框。
我错过了什么?这些复选框已经是数据绑定。
如果我更改数据网格的高度以显示更多复选框,则允许我选择更多。这只是一种解决方法,我想了解为什么以及我的代码如何使复选框暴露给视图很重要。
答案 0 :(得分:1)
解决方案可以在这里找到:
WPF Toolkit DataGrid Checkbox Issues
解决方案是禁用RowVirtualization
EnableRowVirtualization="False"
答案 1 :(得分:0)
我错过了什么?这些复选框已经是数据绑定。
如果CheckBox
es是数据绑定,则应设置 source 属性的值,该属性是IsChecked
绑定的CheckBox
属性。
例如,如果您的CheckBox
定义如下:
<CheckBox IsChecked="{Binding Checked}" />
...您应该设置Checked
属性:
foreach(var item in dGrid.Items.OfType<YourClass>())
{
item.Checked = true;
}
确保定义Checked
属性的类正确实现INotifyPropertyChanged
接口:https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx。
这是一种更好的解决方案,可以禁用内置虚拟化,因为后者可能会对性能产生负面影响。