如何实现搜索
本文关键字:搜索 实现 何实现 | 更新日期: 2023-09-27 18:14:33
我正在尝试在一个新项目中实现MVVM(基于WPF &;Prism),其中几乎每个屏幕(视图)都将首先显示搜索屏幕,用户可以选择添加/编辑记录。
搜索屏幕接受一个VM的引用,该VM实现了我的一个接口ISearchProvider(它有一个方法IEnumerable search(字符串标准))。
这个搜索方法是否返回
- 虚拟机的集合(与他们的模型正确设置),将在网格中显示在搜索屏幕或
- 只是模型,以便当用户选择编辑记录(模型)时,所选择的模型被给定给VM的实例,然后被编辑或
- 第三种选择?
无论你打算向用户显示什么,都应该用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
命令可能是一个好主意。这样,从视图绑定就非常简单了。
总结起来,有两点:
- 确保你的搜索逻辑不在视图模型中;让视图模型委托搜索
- 使搜索结果成为视图模型或实际视图模型对象的一部分(因此您可以"feed"它们方便地查看)
我倾向于在网格中显示ViewModels,特别是如果你有一个ViewModelBase类,它的DisplayName实现了INPC和IDataErrorInfo。我的模型很少能完美地捕捉到表示的所有语义,而VM是我们保持这些关注点分离的方式。
HTH,
Berryl