System.InvalidOperationException:ItemsControl与它的项目来源不一致

时间:2018-08-28 15:00:59

标签: c# wpf

我在下面得到了以下异常

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

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

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

感谢您的帮助。谢谢。

--------------------------例外/堆栈跟踪----------------- -----

  

System.InvalidOperationException:ItemsControl不一致   及其项目来源。         有关更多信息,请参见内部异常。 ---> System.Exception:开发人员信息(使用Text Visualizer可以   读这个):       引发此异常是因为名称为'(unnamed)'的控件'System.Windows.Controls.DataGrid Items.Count:0'的生成器   收到了不同的CollectionChanged事件序列   具有Items集合的当前状态。下列   检测到差异:         累计计数0与实际计数9不同。[累计计数为(最后一次复位时的计数+ #Adds-#Remove自   最后一次重置)。]

     

以下一个或多个来源可能引发了错误的事件:        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”   生成器将值设置为“高”并重新运行场景。一种方法   是要运行类似于以下命令:
  System.Diagnostics.PresentationTraceSources.SetTraceLevel(myItemsControl.ItemContainerGenerator,   立即发送的System.Diagnostics.PresentationTraceLevel.High)   窗口。这导致检测逻辑在每次   CollectionChanged事件,因此它将降低应用程序的速度。

     

---内部异常堆栈跟踪的结尾---   System.Windows.Controls.ItemContainerGenerator.Verify()在   System.Windows.Controls.VirtualizingStackPanel.MeasureChild(IItemContainerGenerator&   生成器,IContainItemStorage&itemStorageProvider,   IContainItemStorage&parentItemStorageProvider,Object&parentItem,   Boolean&hasUniformOrAverageContainerSizeBeenSet,Double&   计算出的UniformOrAverageContainerSize,Double&   计算的UniformOrAverageContainerPixelSize,布尔值和   computeAreContainersUniformlySized,Boolean&   hasAnyContainerSpanChanged,IList&项目,Object&项目,IList&   children,Int32&childIndex,Boolean&visualOrderChanged,Boolean&   isHorizo​​ntal,Size&childConstraint,Rect&视口,   VirtualizationCacheLength&cacheSize,VirtualizationCacheLengthUnit&   cacheUnit,Boolean和foundFirstItemInViewport,Double&   firstItemInViewportOffset,Size&stackPixelSize,Size&   stackPixelSizeInViewport,Size&stackPixelSizeInCacheBeforeViewport,   Size&stackPixelSizeInCacheAfterViewport,Size&stackLogicalSize,   Size&stackLogicalSizeInViewport,Size&   stackLogicalSizeInCacheBeforeViewport,Size&   stackLogicalSizeInCacheAfterViewport,布尔值和   mustDisableVirtualization,布尔值为isBeforeFirstItem,布尔   isAfterFirstItem,布尔值isAfterLastItem,布尔值skipActualMeasure,   布尔skipGeneration,布尔&   hasBringIntoViewContainerBeenMeasured,布尔值和   hasVirtualizingChildren)   System.Windows.Controls.VirtualizingStackPanel.MeasureOverrideImpl(大小   约束,可为空1& lastPageSafeOffset, List 1&   previousMeasuredOffsets,可为空1和lastPagePixelSize,布尔值   重新测量)   System.Windows.Controls.VirtualizingStackPanel.MeasureOverride(大小   约束)   System.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride(大小   约束)在System.Windows.FrameworkElement.MeasureCore(Size   位于System.Windows.UIElement.Measure(Size的availableSize)   availableSize)位于   System.Windows.ContextLayoutManager.UpdateLayout()位于   System.Windows.UIElement.UpdateLayout()在   System.Windows.Controls.VirtualizingStackPanel。<> c__DisplayClass94_0.b__0()   在System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate   回调,对象参数,Int32 numArgs)   System.Windows.Threading.ExceptionWrapper.TryCatchWhen(对象源,   委托回调,对象args,Int32 numArgs,委托catchHandler)

1 个答案:

答案 0 :(得分:1)

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

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