C# 为什么ObservableCollection不支持批量更改?

C# 为什么ObservableCollection不支持批量更改?,c#,wpf,observablecollection,C#,Wpf,Observablecollection,支持操作(如AddRange或RemoveRange)的observeCollection会导致哪些潜在问题?既然ObservableCollection经常与WPF一起使用,那么微软没有提供它们肯定有原因 您可以实现自己的集合,该集合支持批量操作并实现INotifyCollectionChanged。如果我将这样的控件绑定到ItemsControl,会发生什么 有人知道不支持批量更改的Items控件吗?internet上有许多可观察集合的扩展,这些扩展添加了添加/删除范围的概念,或者允许您延迟

支持操作(如
AddRange
RemoveRange
)的
observeCollection
会导致哪些潜在问题?既然ObservableCollection经常与WPF一起使用,那么微软没有提供它们肯定有原因

您可以实现自己的集合,该集合支持批量操作并实现
INotifyCollectionChanged
。如果我将这样的控件绑定到ItemsControl,会发生什么


有人知道不支持批量更改的Items控件吗?

internet上有许多可观察集合的扩展,这些扩展添加了添加/删除范围的概念,或者允许您延迟更新并手动启动它们。例如,请参见此堆栈溢出问题:

您还可以实现触发重置事件的批量添加,这将导致UI重新呈现集合中的所有项:

这些允许您更有效地管理UI更新。
ItemsControl
如何处理集合更改事件,该事件详细说明更改项的列表,这取决于WPF框架本身。我认为它处理这件事很明智


我给您的建议是,如果性能对您至关重要,并且您的收藏中有许多项目正在更新,并且遇到性能问题,然后,子类
observateCollection
以最适合应用程序需要的方式管理集合更改通知。

NotifyCollectionChangedEventArgs
包括索引信息。删除项会导致索引重新排列,插入项也是如此。因此,虽然并非完全不可能,但提供与靶场协同工作的能力将相当困难,而且可能效率低下

微软没有提供它们肯定是有原因的

它们并没有提供所有可能的功能,这(也是)成本与需求的对比

您可以实现自己的集合,该集合支持批量操作并实现
INotifyCollectionChanged


对。当您这样做时,您会发现集合必须选择如何/何时传播这些更改。我从未尝试过,但我认为视图或视图模型可以做出比可重用集合更好的决策

我不认为有任何潜在的缺点或问题,只是它不存在。事实上,“System.Collections.Generic”中的大多数类型也不提供“AddRange”功能

与此同时,许多人已经创建了自己版本的“ObservableCollection”,以提供您想要的功能。INotifyCollectionChanged包含足够的信息,它的处理程序可以记录某一范围的项可能由于这个原因而受到影响的时间


最后但并非最不重要的一点是,如果您绑定了一个具有这些“范围”类型操作的集合,您会发现它们将与您的UI一起工作,正如您所期望的那样

快速浏览链接问题的实现,会发现实现效率低下。基本上,每个添加的项目都会引发
CollectionChanged
事件,然后再次重置集合@肯特布加特你好肯特,你是说答案是?我觉得不错。AddRange方法迭代添加的项,然后触发单个CollectionChanged事件,更改类型为“add”,提供添加项的列表。但是代码的格式不是很好;-)由于RangeObservaleCollection扩展了ObservaleCollection,因此对每个项目调用Add会导致为每个添加的项目引发CollectionChangedEvent。然后,在添加所有项后重置集合,所有这些努力都将白费。除了此之外,如果设置了标志,链接的代码还会覆盖OnCollectionChanged以抑制CollectionChangedEvent;AddRange方法设置此标志,循环并调用每个项的Add,然后取消设置该标志。唯一的索引信息是“发生更改的索引”。添加和删除范围操作很容易提供此信息。@A.R:不,如果删除集合的第一项和最后一项怎么办?事件args中只有一个索引,但需要两个索引。有两个索引。有“NewStartingIndex”和“OldStartingIndex”。后者的描述为“获取发生移动、删除或替换操作的索引”。此外,除非要删除集合中的所有项,您描述的场景是不可能的,因为一个范围内的元素是连续的。我的错-我误读了OP。我想问题是为什么没有
RemoveAll
,就像
List
一样。你说得对:
AddRange
/
RemoveRange
很容易提供。Microsoft.VisualStudio.Language.Intellisense.BulkObservableCollection中有一个BulkObservableCollection类