【问题标题】:Clearing an ObservableCollection清除 ObservableCollection
【发布时间】:2011-06-04 08:19:16
【问题描述】:

在 WPF 应用程序中,我有一个 ListView 绑定到我的 ViewModel 上的 ObservableCollection。

在应用程序运行期间,我需要删除并重新加载集合中的所有项目。我不需要添加或删除单个项目。

这提示了一个 ObservableCollection 是否真的必要的问题,以及我是否可以将 ListView 绑定到 IEnumerable 并在替换集合时调用 OnPropertyChanged?

由于 ObservableCollection 没有 AddRange 方法,在不替换集合的情况下重新加载的唯一方法是单独添加每个项目。由于每个添加的项目都会触发 CollectionChanged,这可能会对性能产生任何重大影响吗?

最后,由于我使用ICollectionView 来同步当前选中的项目,如果我 替换集合,是否需要再次调用CollectionViewSource.GetDefaultView?我假设我可以重用现有的 CurrentChanged 处理程序。

谢谢 本

【问题讨论】:

  • 我以前测试过这个。 ObservableCollection 比带通知的 List 更快。
  • @vorrtex - 有任何统计数据可以支持这一点吗?这是否适用于我正在考虑更换整个系列的情况?
  • 使用类秒表自己尝试一下。性能问题只存在于显示项目中,并且由于 UI 虚拟化,许多项目不会改变任何内容。

标签: wpf observablecollection


【解决方案1】:

我会说你的直觉是正确的:如果你从不添加或删除单个项目,但总是换掉整个列表,并且你相当确定要求不会改变,那么你最好一个不可观察的列表(或 IEnumerable)和 INotifyPropertyChanged。

如果列表很大,这会加快速度。但最大的好处是可读性:它会更清楚地表达你的意图。下一个维护您的代码的人不会到处寻找所有可以从 ObservableCollection 中添加和删除元素的代码;他们将能够快速而清晰地看到您总是换掉整个列表。

【讨论】:

    【解决方案2】:

    我的回答是视情况而定。

    如果您的集合可以超过 10000 个对象,我会说最好避免 10000 个集合事件发生更改,并用一个属性更改来替换它们。

    这里最好的解决方案是通过从列表继承来实现您自己的行为,并根据需要实现 INCC。

    如果您选择使用简单的 IEnumerable,则每次引用更改时都需要请求 DefualtView

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多