我应该绑定到ICollectionView或ObservableCollection

Car*_*s00 79 .net c# data-binding wpf mvvm

应该绑DataGrid一个

ICollectionView = CollectionViewSource.GetDefaultView(collection)

或者

ObservableCollection<T> collection; ???

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

Jon*_*Jon 123

总是绑定到一个ICollectionView,无论你是否明确.

假设我们有

var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,绑定到collection或者collectionView是同一个:绑定引擎将绑定到默认集合视图(引用等于collectionView),如果您告诉它绑定到collection.

这意味着你的问题的答案是"它完全没有区别".

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

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

考虑到每个视图都有自己的当前项目,排序条件等概念,如果您打算对同一个集合进行多次绑定,并且绑定控件需要具有当前项目,过滤器和公司的不同概念,那么你想要的是显式绑定到同一底层集合的多个视图.


Jim*_*uts 34

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

ICollectionView除了INotifyCollectionChanged在底层集合实现事件时传播事件之外,还将使您能够对集合进行过滤,排序或分组.

只要绑定到MVVM,任何一种类型都适用于MVVM.使用ICollectionView时,你需要排序,筛选,或分组.ObservableCollection<T>如果不这样做,请直接使用.


Eup*_*ric 9

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

其他选项是使用ICollectionView和使用实现它的类,但不是WPF本身的一部分.


Har*_*san 7

我不这么认为它必须对自己做任何事情MVVM.ICollectionView提供其他功能,如分组分组等,如果您需要这些功能,IColectionView否则只需使用ObservableCollection