2011-01-05 69 views
2

在WPF应用程序我有绑定到我的视图模型一个ObservableCollection一个ListView。清除一个ObservableCollection

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

这个提示问题一个ObservableCollection是否真有必要,以及是否我可以ListView控件只是绑定到IEnumerable和调用OnPropertyChanged收集更换时?

由于的ObservableCollection不具有的AddRange方法,无需更换集合将单独添加每个项目重装的唯一途径。自从为每个添加的项目引发了CollectionChanged后,这可能会有什么重大的性能影响?

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

感谢 本

+0

我以前测试过。 ObservableCollection比带通知的List更快。 – vorrtex 2011-01-05 23:14:02

+0

@vorrtex - 任何统计数据支持?这是否适用于我正在考虑更换整个系列的情况? – 2011-01-06 09:12:09

+0

只需使用班级秒表自己尝试一下。性能问题仅在显示项目时存在,并且由于UI虚拟化,许多项目不会改变任何内容。 – vorrtex 2011-01-06 20:55:39

回答

4

我会说你的直觉是正确的:如果你从不添加或删除个别项目,却总是换出整个列表,并且您确信该要求不会改变,那么最好使用不可观察列表(或IEnumerable)和INotifyPropertyChanged。

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

1

我的答案是它依赖。

如果您的收藏可以去10000的对象,我会说,它能够更好地避免收集改变的10000个事件,并取代它们与一个属性改变。

这里最好的解决方案是从列表落实继承自己的行为,因为你需要它的工作落实INCC。

如果您选择使用一个简单的IEnumerable你需要每次都问DefualtView参考变化