我正在实现一个显示项目列表的wpf应用程序,并提供通过键入文本框来过滤此列表的功能(我认为非常简单的用例)。
我们正在使用MVVM结构。
我的问题是,谁负责过滤清单?视图还是视图模型?
我应该在xaml.cs中实现“OnTextChanged”事件,还是应该在ViewModel中使用属性并使用PropertyChanged来过滤列表。
后续问题是,我应该在ViewModel中使用BindingList / ObservableCollection,还是使用ICollectionView将ItemsControl绑定到?
我尝试了两种方法,但它们都有效。赋予ViewModel责任使得View远离View,但另一方面我并不完全相信ViewModels应用过滤的责任(例如:不同的视图可能需要不同的过滤)
有什么想法吗?
感谢, 罗埃尔
编辑:
将它放在ViewModel中让我烦恼的是(在我当前的实现中)有一个System.Windows.Data的引用。这是我在ViewModel中没有的参考,因为它显然与View相关。或者我错过了什么?相关代码:ICollectionView customerView = CollectionViewSource.GetDefaultView(customers);
答案 0 :(得分:6)
ViewModel,毫无疑问。避免代码隐藏是模式的最终目标 - 实际上,ViewModel本身就是视图背后的代码。
例如:可能需要不同的视图 不同的过滤
不同的视图应该有不同的ViewModel。 ViewModel基本上是一种(更多)面向对象的代码隐藏文件方法。
关于CollectionView:您可以在视图XAML中定义CollectionViewSource,然后将其排序和过滤属性绑定到ViewModel。这应该在ViewModel和CollectionView中保持控制,但我相信它是过度工程的。
答案 1 :(得分:4)
您可以在我的博客上查看this article,其中我使用MVVM方法来过滤项目集合。我认为这绝对是VM类的责任。
答案 2 :(得分:3)
我认为这种过滤功能属于viewmodel。请记住,您希望在viewmodel中保留尽可能多的可测试代码(您将进行单元测试,对吧?)。相反,你会希望保持视图的精益和平均值。
过滤功能是通用的,不会像这样绑定到视图。但是,如果不同的视图需要不同的过滤,您应该将其视为viewmodel支持的附加功能。
答案 3 :(得分:1)
没有正确的技术答案。该模式的目的是分离功能和美学的关注,因为艺术设计师不了解如何实现功能,并且UI很难测试。
但是,如果您可以将过滤参数设置为非常简单的,例如一个名为“Region”的文本属性,可以设置为“Europe”,“North America”,“Aisa”等,它们非常易于理解,并且可以独立测试。它允许您对视图中的功能(在非常有限的意义上)进行一点控制。如果这对你的努力有一些价值,那就去做吧。如果没有,请不要。
最终,如果尝试应用这种模式会导致你暂停并怀疑哲学上的差异,以及生产力的代价,那么它就无法帮助你了。
答案 4 :(得分:0)
我同意你的看法,VieModel中存在View技术泄漏令人不安。与此类似,我在使用System.Windows.Input的ViewModels中使用了一个RelayCommand对象。
由于这里发布的所有原因,我认为ViewModel是这种媒体(wpf / silverlight)的正确设计选择,即使它不够完美。