C# 选中所有wpf datagrid复选框只会选择视图中的项目

C# 选中所有wpf datagrid复选框只会选择视图中的项目,c#,wpf,checkbox,datagrid,C#,Wpf,Checkbox,Datagrid,我使用以下方法选择datagrid中的所有复选框: private void CheckboxSelectAll(int column) { for (int i = 0; i < twn; i++) { var row = (DataGridRow)dGrid.ItemContainerGenerator.ContainerFromIndex(i); if (row == null) co

我使用以下方法选择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;
        }
    }
private void复选框selectAll(int列)
{
对于(int i=0;i
这仅在所有列都在视图中时有效。例如,如果复选框的数量超过datagrid的高度,它将不选择这些复选框。我必须向下滚动,将它们显示在视图中,然后重新调用我的方法以最终选中剩余的复选框

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


如果我更改datagrid的高度以显示更多复选框,这将允许我选择更多复选框。这只是一种解决方法,我想了解为什么我的代码会使复选框对视图很重要。解决方案可以在这里找到:

解决方案是禁用RowVirtualization

EnableRowVirtualization="False" 
我错过了什么?这些复选框已被数据绑定

如果
复选框
是数据绑定的,则应设置
复选框
被选中的
属性绑定到的源属性的值

例如,如果您的
复选框定义如下:

<CheckBox IsChecked="{Binding Checked}" />
确保定义了
Checked
属性的类正确实现了
INotifyPropertyChanged
接口:


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

在您的循环中,twn是什么?一个双倍值,也等于存在的行数。如果您有大量行,如果您禁用虚拟化,可能会出现性能问题。
foreach(var item in dGrid.Items.OfType<YourClass>())
{
    item.Checked = true;
}