是否应将DataGrid
绑定到
ICollectionView = CollectionViewSource.GetDefaultView(collection)
或
ObservableCollection<T> collection;
???
MVVM的最佳实践是什么?为什么?
答案 0 :(得分:120)
总是绑定到ICollectionView
,无论您是否明确。
假设我们有
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
在这种情况下,绑定到collection
或collectionView
是同一个:绑定引擎将绑定到默认集合视图(引用等于collectionView
),如果你告诉它绑定到collection
。
这意味着您的问题的答案是“它完全没有区别”。
完全清楚:即使直接绑定到集合,绑定引擎也会绑定到默认视图。修改视图的属性(例如排序条件)将影响看似直接绑定到集合的绑定,因为它在封面后面是对默认视图的绑定。
然而,还有另一个有趣且相关的问题:是否应该绑定到默认集合视图(即,对于集合本身,因为没有理由显式绑定到默认视图)或同一集合的另一个视图?
考虑到每个视图都有自己的当前项目,排序条件等概念,如果您打算对同一个集合进行多次绑定,并且绑定控件需要具有当前项目的不同概念,过滤器和公司,那么你想要的是显式绑定到同一底层集合的多个视图。
答案 1 :(得分:32)
ObservableCollection<T>
实现INotifyCollectionChanged
,并在集合中的项目发生更改时通知用户界面。
ICollectionView
事件, INotifyCollectionChanged
将使您能够对集合进行过滤,排序或分组。
只要你绑定它,任何一种类型都适用于MVVM。需要排序,过滤或分组时,请使用ICollectionView
。如果不这样做,请直接使用ObservableCollection<T>
。
答案 2 :(得分:9)
只是为了补充乔恩所说的话。主要区别在于,通过使用CollectionViewSource.GetDefaultView(collection)
,您将使ViewModel依赖于WPF。许多MVVM纯粹主义者不喜欢这样,这会使ObservableCollection只有有效选项。
其他选项是使用ICollectionView
并使用实现它的类,但不是WPF本身的一部分。
答案 3 :(得分:7)
我不认为它必须对MVVM
本身做任何事情。如果您需要使用ICollectionView
IColectionView
,ObservableCollection
会提供额外的功能,例如评分分组等,否则只需使用{{1}}
答案 4 :(得分:2)
如果您希望网格显示应用于视图的设置,则可以绑定到视图,例如过滤,否则视图是多余的。