【问题标题】:selecting all wpf datagrid checkboxes only selects items in view选择所有 wpf datagrid 复选框仅选择视图中的项目
【发布时间】:2017-08-27 19:30:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 在你的循环中,twn 是什么?
  • 一个双精度数,也等于存在的行数。

标签: c# wpf checkbox datagrid


【解决方案1】:

可以在这里找到解决方案:

WPF Toolkit DataGrid Checkbox Issues

解决办法是禁用 RowVirtualization

EnableRowVirtualization="False" 

【讨论】:

  • 如果你有大量的行,如果你禁用虚拟化,你可能会遇到性能问题。
【解决方案2】:

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

如果CheckBoxes 是数据绑定的,您应该设置CheckBoxIsChecked 属性绑定到的source 属性的值。

例如,如果您的 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

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

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 2010-10-19
    • 2017-11-23
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多