如何实现搜索

本文关键字:搜索 实现 何实现 | 更新日期: 2023-09-27 18:14:33

我正在尝试在一个新项目中实现MVVM(基于WPF &;Prism),其中几乎每个屏幕(视图)都将首先显示搜索屏幕,用户可以选择添加/编辑记录。

搜索屏幕接受一个VM的引用,该VM实现了我的一个接口ISearchProvider(它有一个方法IEnumerable search(字符串标准))。

这个搜索方法是否返回

  1. 虚拟机的集合(与他们的模型正确设置),将在网格中显示在搜索屏幕或
  2. 只是模型,以便当用户选择编辑记录(模型)时,所选择的模型被给定给VM的实例,然后被编辑或
  3. 第三种选择?

如何实现搜索

无论你打算向用户显示什么,都应该用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