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

10
我正在实现一个 WPF 应用程序,该应用程序显示一系列项,并提供通过在文本框中输入来过滤此列表的功能(我认为非常简单)。
我们使用 MVVM 结构。
我的问题是,过滤列表的责任是属于视图还是视图模型?我应该在 xaml.cs 中实现一个 "OnTextChanged" 事件,还是应该在 ViewModel 中使用属性并使用 PropertyChanged 来过滤列表。 随后的问题是,我应该在 ViewModel 中使用 BindingList/ObservableCollection,还是使用 ICollectionView 将 ItemsControl 绑定到?
我尝试了两种方法,它们都有效。将责任交给 ViewModel 可以使 View 的代码保持干净,但另一方面,我并不完全相信过滤应该由 ViewModel 负责(例如:不同的视图可能需要不同的过滤方式)
有什么想法吗?
谢谢, Roel
编辑:
让我困扰的是将其放在 ViewModel 中(在我的当前实现中),其中包含对 System.Windows.Data 的引用。我不想在 ViewModel 中有这样的引用,因为它明显与 View 相关。或者我错过了什么?相关代码:
ICollectionView customerView = CollectionViewSource.GetDefaultView(customers);

这是一个很好的问题,特别是关于ViewModel需要引用System.Windows.Data - pauldoo
5个回答

6

毫无疑问,ViewModel。避免使用代码后台是该模式的最终目标 - 实际上,ViewModel本身就是视图的代码后台。

例如:不同的视图可能需要不同的过滤器。

不同的视图应该有不同的ViewModels。ViewModel基本上是一种(稍微更多)面向对象的代码后台文件。

关于CollectionView:您可以在视图XAML中定义CollectionViewSource,然后将其排序和过滤属性绑定到ViewModel。这应该在ViewModel和CollectionView中保持控制,但我认为这是过度设计。


4

您可以查看我博客上的这篇文章,其中我使用MVVM方法来过滤项目集合。我认为这绝对是VM类的责任。


3
我认为这种过滤功能应该放在视图模型中。记住,你希望尽可能地保持可测试的代码在视图模型中(你会进行单元测试,对吧?)。相反,你会希望保持视图简洁而高效。
过滤功能是通用的,并不直接绑定到视图。但是,如果不同的视图需要不同的过滤功能,则应将其视为视图模型支持的附加功能。

1

没有正确的技术答案。模式的目的是将功能和美学的关注点分开,基于这样一个事实:艺术设计师不知道如何实现功能,而UI很难测试。

但是,如果您可以将过滤参数化为非常简单的内容,例如名为“Region”的文本属性,可以设置为“欧洲”、“北美”、“亚洲”等,那么这就很容易理解,并且可以独立进行测试。它允许您在视图中对功能(在非常有限的意义上)进行一些控制。如果这对您的努力有一定的价值,请这样做。如果没有,请不要这样做。

最终,如果尝试应用此模式使您停下来思考哲学上的区别,从而牺牲生产力,那么它并没有帮助您。


0

我同意你的看法,VieModel 中存在 View 技术泄漏确实令人不安。类似地,我在我的 ViewModel 中使用一个使用 System.Windows.Input 的 RelayCommand 对象。

尽管存在上述原因,我认为 ViewModel 对于这种媒介(wpf/silverlight)是正确的设计选择,即使它并不完美。


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