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

时间:2012-03-05 17:05:25

标签: c# wpf observablecollection

ObservableCollectionAddRangeRemoveRange支持操作导致的潜在问题是什么?由于ObservableCollection经常与WPF一起使用,因此必须有微软没有提供它们的原因。

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

是否有人知道不支持批量更改的ItemsControl?

4 个答案:

答案 0 :(得分:4)

ObservableCollection有许多扩展可以在互联网上找到添加/删除范围的概念,或者允许您推迟更新并手动触发它们。例如,请参阅此Stack Overflow问题:

ObservableCollection Doesn't support AddRange method, so I get notified for each item added, besides what about INotifyCollectionChanging?

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

http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/

这些允许您更有效地管理UI更新。 ItemsControl如何处理集合更改事件,详细说明已更改项目的列表取决于WPF框架本身。我假设它会智能地处理这个问题!

我的建议是,如果性能对您至关重要,并且您的集合中有大量项目正在更新且遇到性能问题,那么子类ObservableCollection以最适合您应用程序的方式管理集合更改通知需要。

答案 1 :(得分:3)

我认为没有任何潜在的缺点或问题,只是它不存在。实际上,您会发现'System.Collections.Generic'中的大多数类型都不提供'AddRange'功能。

与此同时,许多人创建了自己的'ObservableCollection'版本,以提供您想要的功能。 INotifyCollectionChanged包含足够的信息供其处理程序记录,因为可能出于这个原因,一系列项目受到影响。

最后但并非最不重要的一点是,如果您绑定具有这些“范围”类型操作的集合,您会发现它们将按预期与您的UI一起使用

答案 2 :(得分:2)

NotifyCollectionChangedEventArgs包含索引信息。删除项目会导致索引重新洗牌,插入项目也是如此。因此,虽然并非完全不可能,但提供使用范围的能力将相当困难并且可能效率低下。

答案 3 :(得分:1)

  

微软没有提供这些原因的原因

它们不提供所有可能的功能,它(也)是成本与需求的关系。

  

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

是。当你这样做时,你会发现该集合必须选择如何/何时传播这些变化。我从来没有尝试,但我想有一些权衡,View或ViewModel可以做出比可重用集合更好的决策。