清除ObservableCollection

时间:2011-01-05 22:53:13

标签: wpf observablecollection

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

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

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

由于ObservableCollection没有AddRange方法,因此重新加载而不替换集合的唯一方法是单独添加每个项目。这可能会产生任何重大的性能影响,因为为每个添加的项目触发了CollectionChanged?

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

由于 本

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

我的答案取决于它。

如果你的收藏品可以超过10000个对象,我会说它更好,以避免10000个收集事件被更改,并用一个属性更改替换它们。

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

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