MVP / MVVM - 过滤列表,谁负责?

时间:2009-10-16 08:29:08

标签: .net wpf model-view-controller mvvm viewmodel

我正在实现一个显示项目列表的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);

5 个答案:

答案 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)的正确设计选择,即使它不够完美。