我正在使用Paul McClean所描述的数据虚拟化:http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx
使用ListView控件可以正常工作。
但是当我将它与DataGrid控件(AsyncVirtualizationCollection)一起使用时,它会抛出异常:
“值不能为空,参数名称:键”
我不知道是什么原因以及如何阻止这种情况发生。我需要DataGrid控件的编辑功能
答案 0 :(得分:4)
只需调试加载/填充数据的位置(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) 未知