WPF数据虚拟化和数据网格
本文关键字:数据 网格 数据网 虚拟化 WPF | 更新日期: 2023-09-27 18:11:35
我正在使用Paul McClean所描述的数据虚拟化:http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx
它与ListView控件一起工作得很好。
,但当我使用它与DataGrid控件(AsyncVirtualizationCollection),它抛出异常:
"值不能为空,参数名:key"
我不知道原因是什么以及如何阻止它的发生。我需要DataGrid控件的编辑功能
我也遇到过这种情况。事实证明,问题是VirtualizingCollection
(AsyncVirtualizingCollection
的基类)中的代码:
public T this[int index]
{
// snip
// defensive check in case of async load
if (_pages[pageIndex] == null)
return default(T);
// snip
}
如果T
是引用类型,default(T)
是null
, DataGrid
不支持空行对象
VirtualizingCollection
添加了一个公共属性来保持默认值:
public T DefaultValue = default(T);
并将上面的代码更改为返回DefaultValue
而不是default(T)
。然后,在构造AsyncVirtualizingCollection
时,将DefaultValue
设置为加载过程中显示的虚拟对象。
你在用字典吗?调试并检查是否尝试在字典中添加空值作为键。或者检查你是否在gridview上有一个DataKeyNames参数,你试图插入一个空键。
只调试加载/填充数据的地方(F10/F11)。查看Visual Studio中的Locals窗口
我发现这个异常实际上发生在DataGridItemAttachedStorage
类。这里有一些调用栈帧,希望有人能给点提示。对不起,我的英语很差。
mscorlib.dll!System.Collections.Generic.Dictionary<object,System.Collections.Generic.Dictionary<System.Windows.DependencyProperty,object>>.FindEntry(object key) 未知
mscorlib.dll!System.Collections.Generic.Dictionary<object,System.Collections.Generic.Dictionary<System.Windows.DependencyProperty,object>>.TryGetValue(object key, out System.Collections.Generic.Dictionary<System.Windows.DependencyProperty,object> value) 未知
PresentationFramework.dll!System.Windows.Controls.DataGridItemAttachedStorage.TryGetValue(object item, System.Windows.DependencyProperty property, out object value) 未知
PresentationFramework.dll!System.Windows.Controls.DataGridRow.RestoreAttachedItemValue(System.Windows.DependencyObject objectWithProperty, System.Windows.DependencyProperty property) 未知
PresentationFramework.dll!System.Windows.Controls.DataGridRow.SyncProperties(bool forcePrepareCells) 未知
PresentationFramework.dll!System.Windows.Controls.DataGridRow.PrepareRow(object item, System.Windows.Controls.DataGrid owningDataGrid) 未知
PresentationFramework.dll!System.Windows.Controls.DataGrid.PrepareContainerForItemOverride(System.Windows.DependencyObject element, object item) 未知
PresentationFramework.dll!System.Windows.Controls.ItemsControl.MS.Internal.Controls.IGeneratorHost.PrepareItemContainer(System.Windows.DependencyObject container, object item) 未知