我正在实现一个显示项目列表的 wpf 应用程序,并提供通过在文本框中键入来过滤此列表的功能(我认为这是非常微不足道的用例)。
我们使用的是 MVVM 结构。
我的问题是,过滤列表是谁的责任? View 还是 View 模型?
我应该在 xaml.cs 中实现“OnTextChanged”事件,还是应该使用 ViewModel 中的属性并使用 PropertyChanged 过滤列表。
后续问题是,我应该在 ViewModel 中使用 BindingList/ObservableCollection,还是使用 ICollectionView 将 ItemsControl 绑定(bind)到?
我尝试了这两种方法,它们都有效。赋予 ViewModel 责任使 View 后面的代码保持空白,但另一方面,我并不完全相信应用过滤是 ViewModel 的责任(例如:不同的 View 可能需要不同的过滤)
有什么想法吗?
谢谢,
罗尔
编辑:
将它放在 ViewModel 中让我烦恼的是(在我当前的实现中)有一个引用 System.Windows.Data。这是我宁愿在 ViewModel 中没有的引用,因为它显然与 View 相关。还是我错过了什么?相关代码:
ICollectionView customerView = CollectionViewSource.GetDefaultView(customers);
最佳答案
ViewModel,毫无疑问。避免代码隐藏是该模式的最终目标——实际上,ViewModel 本身就是 View 背后的代码。
eg: different views might require different filtering
不同的 View 应该有不同的 ViewModel。 ViewModel 基本上是一种(多一些)面向对象的代码隐藏文件方法。
关于 CollectionView:可以在 View XAML 中定义 CollectionViewSource,然后将其排序和过滤属性绑定(bind)到 ViewModel。这应该在 ViewModel 和 CollectionView 中保持控制,但我相信它是过度设计的。
关于.net - MVP/MVVM - 列表过滤,谁负责?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1576817/