是否应该将DataGrid绑定到

ICollectionView = CollectionViewSource.GetDefaultView(collection)

或发送到

ObservableCollection<T> collection; ???

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

推荐答案

always绑定到ICollectionView,无论你是否明确.

假设我们有

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

在本例中,绑定到collection或绑定到collectionView是相同的:如果您告诉绑定引擎绑定到collection,则绑定引擎将绑定到默认集合视图(引用等于collectionView).

This means that the answer to your question is "it makes absolutely no difference".

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

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

考虑到每个视图都有其自己的当前项概念、排序标准等,因此如果您打算将多个绑定到同一集合,并且绑定控件需要具有不同的当前项、筛选器和公司概念,那么您需要显式绑定到同一基础集合的多个视图.

.net相关问答推荐

为什么 GetShortestDayName 返回的名称比预期的短?

out 和 ref 可以用作临时变量吗?

如何正确使用“await using”语法?

为什么 HashSet 比 HashSet 慢这么多?

.NET 标准与 .NET Core

.NET Core 和 .NET 标准类库项目类型有什么区别?

无法加载文件或程序集“System.ValueTuple”

软件包版本始终为 1.0.0,带有 dotnet pack

yield 和 await 如何在 .NET 中实现控制流?

.NET 框架如何为 OutOfMemoryException 分配内存?

多行 C# 插值字符串文字

如何下载没有 nuget.exe 或 Visual Studio 扩展的 Nuget 包?

判断 HttpStatusCode 是代表成功还是失败

C# 6.0 是否适用于 .NET 4.0?

EnsureSuccessStatusCode 的使用和它抛出的 HttpRequestException 的处理

你如何循环当前加载的程序集?

为什么某些 C# lambda 表达式编译为静态方法?

运算符重载 ==, !=, Equals

如何从控制台应用程序中的 Task.WaitAll() 获取返回值?

比较 C# 中的字符串和对象