如何实现搜索?

时间:2011-11-13 20:10:51

标签: c# wpf mvvm

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

搜索屏幕引用了VM,它实现了我的一个接口ISearchProvider(它有一个IEnumerable Search方法(字符串条件))。

此搜索方法是否应返回

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

2 个答案:

答案 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