WPF数据虚拟化和DataGrid

时间:2011-10-17 19:54:30

标签: c# .net wpf

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

使用ListView控件可以正常工作。

但是当我将它与DataGrid控件(AsyncVirtualizationCollection)一起使用时,它会抛出异常:

“值不能为空,参数名称:键”

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

3 个答案:

答案 0 :(得分:4)

你正在使用字典吗?调试并检查是否尝试在字典中添加空值作为键。 或者检查您是否在gridview上有一个DataKeyNames参数,并且您尝试插入一个空键。

只需调试加载/填充数据的位置(F10 / F11)。在Visual Studio中观察您的Locals窗口。

答案 1 :(得分:3)

我也碰到了这个。事实证明,问题是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设置为在加载过程中显示的虚拟对象。

答案 2 :(得分:0)

我发现这个异常实际上是在DataGridItemAttachedStorage类中发生的。 这里有一些callstack框架,希望有人可以给出一个关于它的线索。请关于我可怜的英文。

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) 未知