选择所有wpf datagrid复选框仅选择视图中的项目

时间:2017-04-03 03:19:20

标签: c# wpf checkbox datagrid

我有以下方法来选择数据网格中的所有复选框:

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

只有所有列都在视图中时,这才有效。例如,如果复选框的数量超过数据网格的高度,则不会选择它们。我将不得不向下滚动,将它们暴露给视图,然后重新调用我的方法以最终选择剩余的复选框。

我错过了什么?这些复选框已经是数据绑定。

如果我更改数据网格的高度以显示更多复选框,则允许我选择更多。这只是一种解决方法,我想了解为什么以及我的代码如何使复选框暴露给视图很重要。

2 个答案:

答案 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

这是一种更好的解决方案,可以禁用内置虚拟化,因为后者可能会对性能产生负面影响。