首页 > 解决方案 > System.InvalidOperationException:ItemsControl 与其项目源不一致

问题描述

我在下面收到以下异常

要知道的事情:
-我研究了这个异常,发现所有对它的引用都涉及使用线程的人----我没有使用线程,我的应用程序是普通的单线程和线性的。- 我发现的建议答案是使用 Dispatcher 和 BeginInvoke() 方法。我不使用那些。它们与我的代码无关。-我正在使用 MVVM。根据错误,这个对象列表在我的视图模型中引发了错误

  private List<curve> curves{get;set;}

这是 .net4.5 的错误吗?可能是什么原因造成的,我该如何解决?

任何帮助表示赞赏。谢谢。

--------------------------异常/堆栈跟踪-------- --

System.InvalidOperationException:ItemsControl 与其项目源不一致。有关更多信息,请参阅内部异常。---> System.Exception:面向开发人员的信息(使用文本可视化工具阅读此内容):引发此异常是因为控件“System.Windows.Controls.DataGrid Items.Count:0”的生成器名称为“(未命名)”已收到与 Items 集合的当前状态不一致的 CollectionChanged 事件序列。检测到以下差异:累计计数 0 与实际计数 9 不同。[累计计数为(上次重置时的计数 + #Adds - 自上次重置以来的 #Removes)。]

以下一个或多个来源可能引发了错误事件: System.Windows.Controls.ItemContainerGenerator System.Windows.Controls.ItemCollection System.Windows.Data.ListCollectionView System.Collections.Generic.List`1[[AI.ClientHousingUtilities. Module.Models.curve, AI.ClientHousingUtilities.Module, Version=1.24.0.20239, Culture=neutral, PublicKeyToken=null]] (加星标的来源被认为更可能是问题的原因。)

最常见的原因是 (a) 在不引发相应事件的情况下更改集合或其计数,以及 (b) 引发具有不正确索引或项目参数的事件。

异常的堆栈跟踪描述了不一致是如何被检测到的,而不是它们是如何发生的。要获得更及时的异常,请将生成器上的附加属性“PresentationTraceSources.TraceLevel”设置为值“High”并重新运行场景。一种方法是运行类似于以下内容的命令:
System.Diagnostics.PresentationTraceSources.SetTraceLevel(myItemsControl.ItemContainerGenerator, System.Diagnostics.PresentationTraceLevel.High) 从即时窗口。这会导致检测逻辑在每个 CollectionChanged 事件之后运行,因此会减慢应用程序的速度。

--- 内部异常堆栈跟踪结束 --- System.Windows.Controls.ItemContainerGenerator.Verify() at System.Windows.Controls.VirtualizingStackPanel.MeasureChild(IItemContainerGenerator& generator, IContainItemStorage& itemStorageProvider, IContainItemStorage& parentItemStorageProvider, Object& parentItem, Boolean& hasUniformOrAverageContainerSizeBeenSet, Double& computedUniformOrAverageContainerSize, Double& computedUniformOrAverageContainerPixelSize, Boolean& computedAreContainersUniformlySized, Boolean& hasAnyContainerSpanChanged, IList& items, Object& item, IList& children, Int32& childIndex, Boolean& visualOrderChanged, Boolean& isHorizo​​ntal, 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) 在 System.Windows.Controls.VirtualizingStackPanel.MeasureOverrideImpl (Size constraint, NullableBoolean& 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) 在 System.Windows.Controls.VirtualizingStackPanel.MeasureOverrideImpl (Size constraint, NullableBoolean& 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) 在 System.Windows.Controls.VirtualizingStackPanel.MeasureOverrideImpl (Size constraint, NullableSize& 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(大小约束,NullableSize& 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(大小约束,NullableSize& 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,可空的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,可空的System.Windows.Controls.VirtualizingStackPanel.MeasureOverrideImpl 处的布尔 skipGeneration、Boolean& hasBringIntoViewContainerBeenMeasured、Boolean& hasVirtualizingChildren)System.Windows.Controls.VirtualizingStackPanel.MeasureOverrideImpl 处的布尔 skipGeneration、Boolean& hasBringIntoViewContainerBeenMeasured、Boolean& hasVirtualizingChildren)1& lastPageSafeOffset, ListSystem.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride(Size constraint) at System.Windows.Controls.VirtualizingStackPanel.MeasureOverride(Size constraint) at System.Windows.Controls.VirtualizingStackPanel.MeasureOverride(Size constraint) 的 1&previousMeasuredOffsets, Nullable`1&lastPagePixelSize, Boolean remeasure) System.Windows.FrameworkElement.MeasureCore(大小 availableSize) 在 System.Windows.UIElement.Measure(Size availableSize) 在 System.Windows.ContextLayoutManager.UpdateLayout() 在 System.Windows.UIElement.UpdateLayout() 在 System.Windows.Controls.VirtualizingStackPanel.<>c__DisplayClass94_0.b__0( ) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 在 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs,委托 catchHandler)

标签: c#wpf

解决方案


如果源列表在某处被修改并且视图中使用的数据不再与列表中的数据匹配,则可能会发生此错误。是的,这很容易在线程中发生,但不需要线程来引起它。

问题主要源于 List 不支持 INotifyPropertyChanged,因此 UI 不会随着更改保持更新。您可以定义您的curve类以支持 INotifyPropertyChanged 或使用已经处理它的类,例如 ObservableCollection。


推荐阅读