【问题标题】:WPF DataGrid EnableColumnVirtualization="True" Raises NullReferenceException at DataGridCellsPanel.get_HasCorrectRealizedColumns()WPF DataGrid EnableColumnVirtualization="True" 在 DataGridCellsPanel.get_HasCorrectRealizedColumns() 引发 NullReferenceException
【发布时间】:2013-11-20 14:42:01
【问题描述】:

我有一个带有EnableColumnVirtualization="True" 的 WPF DataGrid。用户控件显示,但一旦您滚动或调整大小,您将在DataGridCellsPanel.get_HasCorrectRealizedColumns() 收到NullReferenceException。设置 ColumnVirtualization="False" 可以更正该问题。我已经尝试删除 EnableRowVirtualization="True" ... 等,我认为这可能是由于属性组合造成的,但我可以使用非常简单的 DataGrid 重现该问题:

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="True" EnableColumnVirtualization="True"

还有其他人遇到过这种情况吗?我正在运行 Win7 64。谢谢大家!

   at System.Windows.Controls.DataGridCellsPanel.get_HasCorrectRealizedColumns()
   at System.Windows.Controls.Primitives.DataGridCellsPresenter.SyncProperties(Boolean forcePrepareCells)
   at System.Windows.Controls.DataGridRow.SyncProperties(Boolean forcePrepareCells)
   at System.Windows.Controls.DataGridRow.PrepareRow(Object item, DataGrid owningDataGrid)
   at System.Windows.Controls.DataGrid.PrepareContainerForItemOverride(DependencyObject element, Object item)
   at System.Windows.Controls.ItemsControl.MS.Internal.Controls.IGeneratorHost.PrepareItemContainer(DependencyObject container, Object item)
   at System.Windows.Controls.VirtualizingStackPanel.InsertContainer(Int32 childIndex, UIElement container, Boolean isRecycled)
   at System.Windows.Controls.VirtualizingStackPanel.AddContainerFromGenerator(Int32 childIndex, UIElement child, Boolean newlyRealized, Boolean isBeforeViewport)
   at System.Windows.Controls.VirtualizingStackPanel.MeasureChild(IItemContainerGenerator& generator, IContainItemStorage& itemStorageProvider, IContainItemStorage& parentItemStorageProvider, Object& parentItem, Boolean& hasUniformOrAverageContainerSizeBeenSet, Double& computedUniformOrAverageContainerSize, Boolean& computedAreContainersUniformlySized, IList& items, Object& item, IList& children, Int32& childIndex, Boolean& visualOrderChanged, Boolean& isHorizontal, Size& childConstraint, Rect& viewport, VirtualizationCacheLength& cacheSize, VirtualizationCacheLengthUnit& cacheUnit, Boolean& foundFirstItemInViewport, Double& firstItemInViewportOffset, Size& stackPixelSize, Size& stackPixelSizeInViewport, Size& stackPixelSizeInCacheBeforeViewport, Size& stackPixelSizeInCacheAfterViewport, Size& stackLogicalSize, Size& stackLogicalSizeInViewport, Size& stackLogicalSizeInCacheBeforeViewport, Size& stackLogicalSizeInCacheAfterViewport, Boolean& mustDisableVirtualization, Boolean isBeforeFirstItem, Boolean isAfterFirstItem, Boolean isAfterLastItem, Boolean skipActualMeasure, Boolean skipGeneration, Boolean& hasBringIntoViewContainerBeenMeasured, Boolean& hasVirtualizingChildren)
   at System.Windows.Controls.VirtualizingStackPanel.MeasureOverrideImpl(Size constraint, Nullable`1& lastPageSafeOffset, List`1& previouslyMeasuredOffsets, Boolean remeasure)
   at System.Windows.Controls.VirtualizingStackPanel.MeasureOverride(Size constraint)
   at System.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at System.Windows.ContextLayoutManager.UpdateLayout()
   at System.Windows.Controls.VirtualizingStackPanel.<>c__DisplayClassa.<InitializeViewport>b__7()
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run()
   at ....App.Main() in c:\....\obj\Debug\App.g.cs:line 0

【问题讨论】:

  • 尝试添加 CanUserAddRow="False"
  • 试过了,但仍然收到异常。我很欣赏这个建议。

标签: wpf wpfdatagrid wpf-4.0


【解决方案1】:

我可以通过将 VirtualizationMode 从 Recycling 更改为 Standard 来实现它。

    <DataGrid ItemsSource="{Binding Items}" 
     AutoGenerateColumns="True"
     EnableColumnVirtualization="True"
     Standard.VirtualizingStackPanel.IsVirtualizing="True"
     VirtualizingStackPanel.VirtualizationMode="Standard">

我仍然想知道为什么回收不起作用...错误?

希望这对遇到同样问题的人有所帮助。

【讨论】:

  • 感谢您的修复。使用 Snoop 检查事件堆栈,您可以看到每一行都“包装”在 SelectiveScrollingGrid 控件中。当您滚动时,该控件中的 Rectangle 会接收到冒泡到其他内容的 MouseDown 事件。就我而言,其他的东西是一个带有命令/动作的扩展器。这会被触发并更改基础列表。是被重写的底层列表导致了错误还是仅仅触发了事件?无论如何,您的解决方案都有效。
  • 感谢您提供额外的见解。这一切都有帮助。
  • 如果您要显示包含大量数据(很多列)的网格,则将 VirtualizationMode 设置为标准是不可行的。它显着降低了控制性能。我们一直在 WPF 的 UI 虚拟化中遇到此类问题。
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 2015-04-18
  • 2011-07-18
  • 1970-01-01
相关资源
最近更新 更多