设置DataGrid中的隐藏列为可见时InvalidOperationException
本文关键字:InvalidOperationException DataGrid 隐藏 设置 | 更新日期: 2023-09-27 18:03:17
我有一个用户定义的数据网格(继承自System.Windows.Controls.DataGrid
)与用户定义的列(他们继承自System.Windows.Controls.DataGridColumn
)。在列标题(DataGridColumnHeader
对象)上有一个上下文菜单,允许用户隐藏和取消隐藏DataGrid
中的任何列(在Visible
和Collapsed
之间切换DataGridColumn.Visibility
)。
问题是,有时当将可见性切换回Visible
时,InvalidOperationException
会在BindingExpressionBase.JoinBindingGroup
中引发。这个问题并不总是发生,但可能在10%的情况下。我没有找到任何方法来复制它,而且它似乎并不取决于程序的操作方式(点击速度,点击位置等),因为即使我使用程序来模拟用户输入(AutoHotKey),问题也只会偶尔发生。
到目前为止,我发现BindingExpressionBase.JoinBindingGroup
中的以下行有时返回true
,有时返回false
,用于绑定要重新显示的列中显示的值。只有当返回值是false
时才会出现错误(因此它确实有BindingGroup-Feature
)。
if (!root.HasValue(Feature.BindingGroup))
我知道只有这么少的信息来帮助我解决这个问题是非常困难的,但是我认为现在提供给你所有的细节是太多了。例如,在DataGrid
列中也有用户定义的Control
。
有谁知道我怎样才能进一步隔离这个问题?
我在启用Virtualization
时看到过这种问题,特别是当VirtualizationMode
设置为Recycling时。默认情况下,在DataGrid
中启用虚拟化,其模式为回收(但不确定模式)。
您可以尝试禁用虚拟化(设置VirtualizingStackPanel.IsVirtualizing="False"
)和/或将VirtualizationMode更改为标准(VirtualizingStackPanel.VirtualizationMode="Standard"
)。
在我的一个应用程序中,我有完全相同的DataGrid实现,具有类似的显示/隐藏列实现,禁用Virtualization
,我没有注意到显示/隐藏列的任何问题。