WPF数据虚拟化和数据网格

本文关键字:数据 网格 数据网 虚拟化 WPF | 更新日期: 2023-09-27 18:11:35

我正在使用Paul McClean所描述的数据虚拟化:http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx

它与ListView控件一起工作得很好。

,但当我使用它与DataGrid控件(AsyncVirtualizationCollection),它抛出异常:

"值不能为空,参数名:key"

我不知道原因是什么以及如何阻止它的发生。我需要DataGrid控件的编辑功能

WPF数据虚拟化和数据网格

我也遇到过这种情况。事实证明,问题是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) 未知