我应该绑定到ICollectionView或ObservableCollection

应该绑定DataGrid

ICollectionView = CollectionViewSource.GetDefaultView(collection)

或到了

ObservableCollection<T> collection; ???

什么是MVVM的最佳做法,为什么?

总是绑定到一个ICollectionView ,不pipe你是否明确。

假设我们有

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

在这种情况下,绑定到collectioncollectionView是一样的:绑定引擎将绑定到默认的集合视图(引用等于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

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