我应该绑定到ICollectionView或ObservableCollection
应该绑定DataGrid
的
ICollectionView = CollectionViewSource.GetDefaultView(collection)
或到了
ObservableCollection<T> collection;
???
什么是MVVM的最佳做法,为什么?
你总是绑定到一个ICollectionView
,不pipe你是否明确。
假设我们有
var collection = new ObservableCollection<string>(); var collectionView = CollectionViewSource.GetDefaultView(collection);
在这种情况下,绑定到collection
或collectionView
是一样的:绑定引擎将绑定到默认的集合视图(引用等于collectionView
),如果你告诉它绑定到collection
。
这意味着你的问题的答案是“这完全没有区别”。
简单来说,即使你直接绑定到集合,绑定引擎也会绑定到默认视图。 修改视图的属性(如sorting标准)将影响看起来直接绑定到集合的绑定,因为在它们后面,它是对默认视图的绑定。
然而,还有另外一个有趣和相关的问题:如果绑定到默认的集合视图(即集合本身,因为没有理由显式绑定到默认视图)或同一个集合的另一个视图?
考虑到每个视图都有自己的当前项目,sorting标准等概念,如果你打算有多个绑定到同一个集合,并且绑定的控件需要对当前项目,filter和公司有不同的概念,那么你想要的是显式绑定到相同的基础集合的多个视图。
ObservableCollection<T>
实现INotifyCollectionChanged
并在集合中的项目发生更改时通知UI。
除了传播INotifyCollectionChanged
事件, ICollectionView
将使您能够对集合进行过滤,sorting或分组,如果底层集合实现它。
只要绑定到MVVM,任何一种types都可以和MVVM一起使用。 当您需要sorting,筛选或分组时,使用ICollectionView
。 如果不这样做,直接使用ObservableCollection<T>
。
只是为了增加Jon的话。 主要区别是,通过使用CollectionViewSource.GetDefaultView(collection)
,您使ViewModel依赖于WPF。 许多MVVM纯粹主义者不喜欢这个,这将离开ObservableCollection只有有效的选项。
其他选项是使用ICollectionView
并使用一个实现它的类,但不是WPF本身的一部分。
我不这么认为它必须对MVVM
本身做任何事情。 ICollectionView
提供了额外的function,如挖苦分组等,如果你需要使用IColectionView
否则只需使用ObservableCollection
如果希望网格显示应用于视图的设置,例如过滤,则可以绑定到视图,否则视图是多余的。