我应该绑定到ICollectionView或ObservableCollection

时间:2011-06-11 18:50:03

标签: c# .net wpf data-binding mvvm

是否应将DataGrid绑定到

ICollectionView = CollectionViewSource.GetDefaultView(collection)

ObservableCollection<T> collection; ???

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

5 个答案:

答案 0 :(得分:120)

总是绑定到ICollectionView,无论您是否明确。

假设我们有

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

在这种情况下,绑定到collectioncollectionView是同一个:绑定引擎将绑定到默认集合视图(引用等于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 IColectionViewObservableCollection会提供额外的功能,例如评分分组等,否则只需使用{{1}}

答案 4 :(得分:2)

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