我应该绑定到ICollectionView还是ObservableCollection

本文关键字:还是 ObservableCollection ICollectionView 绑定 我应该 | 更新日期: 2023-09-27 17:58:52

是否应该将DataGrid绑定到

ICollectionView = CollectionViewSource.GetDefaultView(collection)

ObservableCollection<T> collection;???

MVVM的最佳实践是什么?为什么?

我应该绑定到ICollectionView还是ObservableCollection

无论是否显式,始终绑定到ICollectionView

假设我们有

var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);

在这种情况下,绑定到collectioncollectionView是相同的:如果您告诉绑定引擎绑定到collection,则绑定引擎将绑定到默认集合视图(即等于collectionView的引用)。

这意味着你的问题的答案是"绝对没有区别"

需要完全清楚的是:即使直接绑定到集合,绑定引擎也会绑定到默认视图。修改视图的属性(如排序条件)将影响似乎直接绑定到集合的绑定,因为在封面后面,它是到默认视图的绑定。

然而,还有另一个有趣且相关的问题:应该绑定到默认集合视图(即,绑定到集合本身,因为没有理由显式绑定到默认视图)还是绑定到同一集合的另一个视图?

考虑到每个视图都有自己的当前项、排序条件等概念,因此,如果您打算对同一集合进行多个绑定,并且绑定的控件需要对当前项、筛选器和公司有不同的概念,那么您希望显式绑定到同一基础集合的多个视图。

ObservableCollection<T>实现INotifyCollectionChanged,并将在集合中的项目发生更改时通知UI。

如果基础集合实现了INotifyCollectionChanged事件,则ICollectionView将使您能够对集合进行筛选、排序或分组。

只要绑定到MVVM,任何一种类型都可以很好地与MVVM配合使用。当需要排序、筛选或分组时,请使用ICollectionView。不使用ObservableCollection<T>时直接使用。

只是为了补充Jon所说的内容。主要区别在于,通过使用CollectionViewSource.GetDefaultView(collection),您使ViewModel依赖于WPF。许多MVVM纯粹主义者不喜欢这样,这将使ObservableCollection成为唯一有效的选项。

另一种选择是使用ICollectionView并使用实现它的类,但它不是WPF本身的一部分。

我不认为它与MVVM本身有任何关系。ICollectionView提供了其他功能,如排序分组等。如果需要,请使用IColectionView,否则只需使用ObservableCollection

如果您希望您的网格显示应用于视图的设置(例如过滤),您将绑定到视图,否则视图是多余的。