【发布时间】:2011-09-13 03:44:54
【问题描述】:
是否应该将DataGrid 绑定到
ICollectionView = CollectionViewSource.GetDefaultView(collection)
还是去
ObservableCollection<T> collection;???
MVVM 的最佳实践是什么?为什么?
【问题讨论】:
标签: c# .net wpf data-binding mvvm
是否应该将DataGrid 绑定到
ICollectionView = CollectionViewSource.GetDefaultView(collection)
还是去
ObservableCollection<T> collection;???
MVVM 的最佳实践是什么?为什么?
【问题讨论】:
标签: c# .net wpf data-binding mvvm
您总是绑定到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
【讨论】:
如果您希望网格显示应用于视图的设置,您将绑定到视图,例如过滤,否则视图是多余的。
【讨论】: