【问题标题】:MVP/MVVM - Filtering of lists, who has responsibility?MVP/MVVM - 列表过滤,谁负责?
【发布时间】:2010-12-07 07:16:15
【问题描述】:

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

【问题讨论】:

  • 这是一个很好的问题,尤其是关于需要引用 System.Windows.Data 的 ViewModel。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多