一个应该绑定DataGrid
到
ICollectionView = CollectionViewSource.GetDefaultView(collection)
或到
ObservableCollection<T> collection;
???
MVVM的最佳做法是什么,为什么?
一个应该绑定DataGrid
到
ICollectionView = CollectionViewSource.GetDefaultView(collection)
或到
ObservableCollection<T> collection;
???
MVVM的最佳做法是什么,为什么?
Answers:
你总是绑定到ICollectionView
,不管你让它明示或没有。
假设我们有
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
在这种情况下,绑定到collection
或collectionView
相同:绑定引擎将绑定到默认集合视图(引用等于collectionView
)(如果您告诉它绑定到)collection
。
这意味着您的问题的答案是“绝对没有区别”。
只是要清楚一点:即使直接绑定到集合,绑定引擎也会绑定到默认视图。修改视图的属性(例如排序条件)将影响似乎直接绑定到集合的绑定,因为在幕后,它是默认视图的绑定。
但是,还有另一个有趣且相关的问题:应该将一个绑定到默认集合视图(即,由于没有理由显式绑定到默认视图)到集合本身还是绑定到同一集合的另一个视图?
考虑到每个视图都有其自己的当前项目,排序标准等概念,因此,如果您打算对同一集合具有多个绑定,并且绑定控件需要对当前项目,过滤器和公司具有不同的概念,则您想要的是显式绑定到同一基础集合的多个视图。
ObservableCollection<T>
实现,INotifyCollectionChanged
并在更改集合中的项目时通知UI。
ICollectionView
INotifyCollectionChanged
如果基础集合实现了传播事件,那么除了传播事件外,您还可以对集合进行过滤,排序或分组。
只要绑定到MVVM,这两种类型都可以很好地工作。使用ICollectionView
时,你需要排序,筛选,或分组。不使用时ObservableCollection<T>
直接使用。
只是为了补充乔恩所说的话。主要区别在于,通过使用CollectionViewSource.GetDefaultView(collection)
,您使ViewModel依赖于WPF。许多MVVM纯粹主义者不喜欢这样,这会使ObservableCollection成为唯一有效的选项。
其他选择是使用ICollectionView
和使用实现该类的类,但它不是WPF本身的一部分。
我不认为它必须做任何事情MVVM
。ICollectionView
如果需要,则提供额外的功能,如排序分组等,IColectionView
否则只需使用ObservableCollection