我应该绑定到ICollectionView还是ObservableCollection
本文关键字:还是 ObservableCollection ICollectionView 绑定 我应该 | 更新日期: 2023-09-27 17:58:52
是否应该将DataGrid
绑定到
ICollectionView = CollectionViewSource.GetDefaultView(collection)
或
ObservableCollection<T> collection;
???
MVVM的最佳实践是什么?为什么?
无论是否显式,始终绑定到ICollectionView
。
假设我们有
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
在这种情况下,绑定到collection
或collectionView
是相同的:如果您告诉绑定引擎绑定到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
如果您希望您的网格显示应用于视图的设置(例如过滤),您将绑定到视图,否则视图是多余的。