10

我正在实现一个显示项目列表的 wpf 应用程序,并提供通过在文本框中键入来过滤此列表的功能(我认为这是非常微不足道的用例)。

我们使用的是 MVVM 结构。

我的问题是,过滤列表是谁的责任?视图还是视图模型?我应该在 xaml.cs 中实现“OnTextChanged”事件,还是应该使用 ViewModel 中的属性并使用 PropertyChanged 过滤列表。
后续问题是,我应该在 ViewModel 中使用 BindingList/ObservableCollection,还是使用 ICollectionView 将 ItemsControl 绑定到?

我尝试了这两种方法,它们都有效。赋予 ViewModel 责任使 View 后面的代码保持空白,但另一方面,我并不完全相信应用过滤是 ViewModel 的责任(例如:不同的视图可能需要不同的过滤)

有什么想法吗?

谢谢,罗尔

编辑:

将它放在 ViewModel 中困扰我的是(在我当前的实现中)有一个引用 System.Windows.Data。这是我宁愿在 ViewModel 中没有的参考,因为它显然与 View 相关。还是我错过了什么?相关代码:

ICollectionView customerView = CollectionViewSource.GetDefaultView(customers);
4

5 回答 5

6

ViewModel,毫无疑问。避免代码隐藏是该模式的最终目标——实际上,ViewModel 本身就是视图背后的代码。

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

不同的视图应该有不同的 ViewModel。ViewModel 基本上是一种(多一些)面向对象的代码隐藏文件方法。

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

于 2009-10-16T09:02:22.010 回答
4

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

于 2009-10-16T08:54:23.790 回答
3

我认为这种过滤功能属于视图模型。请记住,您希望在视图模型中保留尽可能多的可测试代码(您将对其进行单元测试,对吧?)。相反,您会希望保持视图简洁和平均。

过滤功能是通用的,并且不绑定到视图本身。但是,如果不同的视图需要不同的过滤,您应该将其视为视图模型支持的附加功能。

于 2009-10-16T08:37:51.373 回答
1

没有正确的技术答案。该模式的目的是分离功能和美学的关注点,基于艺术设计师不了解如何实现功能,并且 UI 难以测试。

但是,如果您可以将过滤参数化为非常简单的东西,例如一个名为“Region”的文本属性,可以设置为“Europe”、“North America”、“Aisa”等,这很容易理解,并且可以独立测试. 它允许您对视图的功能(在非常有限的意义上)进行一点控制。如果这对你的努力有一些价值,那就去做吧。如果没有,不要。

最终,如果尝试应用这种模式会导致您暂停并怀疑哲学上的区别,并且以生产力为代价,那么它对您没有帮助。

于 2009-10-16T08:47:18.033 回答
0

我同意你的观点,在 VieModel 中存在 View 技术泄漏是令人不安的。同样,我在使用 System.Windows.Input 的 ViewModel 中使用了 RelayCommand 对象。

尽管出于此处发布的所有原因,我认为 ViewModel 是这种介质(wpf / silverlight)的正确设计选择,尽管它并不完美。

于 2009-10-27T17:52:26.953 回答