c# - 如何实现搜索?

标签 c# wpf mvvm

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

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

如果这个 Search 方法返回

  • 一组虚拟机(其模型设置正确)将显示在搜索屏幕的网格中或
  • 只是模型,这样当用户选择编辑记录(模型)时,选择的模型会被提供给 VM 的实例,然后它会被编辑或
  • 第三种选择?
  • 最佳答案

    无论您打算向用户展示什么,都应该使用 View Model 进行包装。

    您提到用户将选择要编辑的模型。这应该是 查看模型 ;用户将选择模型(实体)进行编辑,但他将显示的内容(或您的 View 将看到的内容)应该是代表某个实体的 View 模型列表。用户(或在这种情况下是 View )不需要任何实际模型的知识。

    现在, View 模型本身不应该进行任何搜索。应该是代表搜索组件的职责是执行搜索并返回结果(无论是某种 DAO,您的自定义工具 - 选项可能会有所不同)。更重要的是,同一个 View 模型还应该负责为 View “提供”可能来自搜索或可能不来自搜索的数据。

    给它代码示例:

    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 接口(interface)公开单个 Search 可能是个好主意。 命令 .这样,从 View 绑定(bind)非常简单。

    总结一下,简单的2点:
  • 确保您的搜索逻辑不在 View 模型中;让 View 模型委托(delegate)搜索
  • 使搜索结果成为 View 模型或实际 View 模型对象的一部分(因此您可以“喂”它们以轻松查看)
  • 关于c# - 如何实现搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8114364/

    相关文章:

    multithreading - ViewModel 和多线程最佳实践

    backbone.js - YII HTML 渲染

    c# - 我需要使用 MVVM 导航到另一个包含 WPF 中父对象的子对象的 View

    c# - 如何检测 TFS 项目源代码已被修改

    WPF DataGrid.GroupStyle 与 MVVM

    wpf - 在 DataGrid 中绑定(bind) TextBlock 文本和 ComboBox SelectionChanged 事件时遇到问题

    wpf - 银光下的 Canvas 装订

    c# - 资源.Designer.cs : "Resource ... does not contain a definition for ..."

    c# - 如何以编程方式合并两个多边形(对象数组)?

    c# - 如何在 ControllerContext 中模拟 DisplayMode 以进行单元测试 c#