MVVM:在ViewModel中使用CollectionView还是在xaml中使用CollectionViewSource?

41
我正在使用MVVM模式开发WPF应用程序,需要在ListView中显示一系列项目(带有过滤功能),并在主/详细视图中显示所选项的字段。 我对以下两种方法之间犹豫不决:

  1. 在我的ViewModel中公开一个CollectionView,并进行绑定。
  2. 在我的ViewModel中公开一个简单的IList,并在XAML中使用CollectionViewSource创建CollectionView。

有没有一个标准的做法? 对于最佳方式有什么想法吗?


1
很惊奇的是,你经常会发现有人已经问了和你要问的完全一样的问题。谢谢!:) - Ignacio Soler Garcia
2个回答

33

我选择了前者(从VM中暴露 CollectionView ),但真正重要的是您的筛选逻辑所在的位置。这应该绝对在VM中,以便可以进行测试,即使视图必须将 CollectionViewSource 连接到VM。话虽如此,我认为从VM中公开CollectionView并没有什么特别恶劣或反MVVM的地方。


同意肯特的观点,将 def 放在虚拟机中以便进行测试。 - Mark Cooper
2
如果有人感兴趣的话,Microsoft PRISM的开发者指南在第79页推荐了相同的方法。 - RichardOD
1
我不喜欢这种方法中需要从ViewModels dll引用WindowsBase和PresentationFramework dll,有没有什么方法可以在不引用这些dll的情况下公开视图? - Arsen Mkrtchyan
视图越简单,生活就会变得越好 :) +1 - Ignacio Soler Garcia
1
为了避免在ViewModel中引用WPF dll,可以使用ICollectionView接口(System.ComponentModel)而不需要WindowsBasePresentationFramework.dll。要从您的ObservableCollection<T>创建一个ICollectionView,请使用myCollectionView = CollectionViewSource.GetDefaultView(myObservableCollection),然后在XAML中设置绑定,<DataGrid ... ItemsSource="{Binding myCollectionView, Mode=OneWay, ..."} ...></DataGrid > https://msdn.microsoft.com/zh-cn/library/system.componentmodel.icollectionview(v=vs.110).aspx @ArsenMkrtchyan - turkinator
显示剩余7条评论

3
我知道我回答你的问题有点晚,但今天我才看到它。
我创建了使用CollectionViewSource的主/细节视图模型,并在博客中发表了相关文章。
我在这里写了一个主/细节表的视图模型,它使用: http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html 你也可以在我的博客页面上找到ObservableCollection类的视图模型。
也许对你有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接