我正在尝试在一个新项目中实现MVVM(基于WPF和Prism),其中几乎每个屏幕(视图)都会首先显示一个搜索屏幕,用户可以选择添加/编辑记录。
搜索屏幕引用了VM,它实现了我的一个接口ISearchProvider(它有一个IEnumerable Search方法(字符串条件))。
此搜索方法是否应返回
答案 0 :(得分:2)
您计划向用户展示的内容应该包含在View Model中。
您提到用户将选择要编辑的模型。这应该是查看模型;用户将选择要编辑的模型(实体),但他将显示的内容(或您的视图将看到的内容)应该是代表某个实体的视图模型列表。用户(或在本例中为视图)不需要任何实际模型的知识。
现在,视图模型不应该自己进行任何搜索。它应该委托搜索到负责执行搜索和返回结果的组件(无论是某种DAO,您的自定义工具 - 选项可能会有所不同)。更重要的是,相同的视图模型还应该负责“馈送”视图,其中包含可能会或可能不会从搜索中获取的数据。
给它代码示例:
public class UserListViewModel : ISearchProvider
{
private IUserFinder userFinder;
public UserListViewModel(IUserFinder userFinder)
{
this.userFinder = userFinder;
}
public ObservableCollection<UserViewModel> Users { get; private set; }
public void Search(string criteria)
{
var users = this.userFinder.Search(criteria);
// rebuild users collection - view will get notified of any changes
// made to .Users property as it is ObservableCollection
}
}
此外,让ISearchProvider接口公开单个Search
命令可能是个好主意。这样,从视图绑定非常简单。
总结一下,有2个简单点:
答案 1 :(得分:1)
我的首选是在网格中显示ViewModel,特别是如果你有一个带有实现INPC和IDataErrorInfo的DisplayName的ViewModelBase类。我的模型很少能完美地捕获演示文稿的所有语义,而VM就是我们如何将这些问题分开来的。
HTH,
Berryl