如何为多个视图模型实现相同的搜索功能

本文关键字:搜索 功能 实现 模型 视图 | 更新日期: 2023-09-27 18:33:08

我有一个主视图,其中我有一个选项卡控件。每个选项卡的内容都是一个树视图,它存在于不同的视图中。这是我的主要视图,其中我使用了其他 2 个视图

在我的FirstListView中,我有一个树视图,一个文本框和一个按钮。

<TabControl x:Name ="MainTab" SelectionChanged="OnTabSelectionChanged">
    <TabItem Header="First" >
        <view:FirstListView x:Name="FirstView"/>
    </TabItem>
    <TabItem  Header="Second" >
        <view:SecondListView x:Name ="SecondView"/>
    </TabItem>
</TabControl>

添加了文本框和按钮以在树中执行搜索。

与 FirstListView 关联的视图模型具有在其构造器中初始化的命令。

_searchCommand = new SearchFamilyTreeCommand(this);

SearchFamiltyTreeCommand 是一个派生自 ICommand 的类,执行方法调用一个函数来执行搜索。这在FirstViewModel中存在。

#region SearchCommand
public ICommand SearchCommand
{
    get { return _searchCommand; }
}
private class SearchFamilyTreeCommand : ICommand
{
    readonly FunctionListViewModel _functionTree;
    public SearchFamilyTreeCommand(FunctionListViewModel functionTree)
    {
        _functionTree = functionTree;
    }
    public bool CanExecute(object parameter)
    {
        return true;
    }
    event EventHandler ICommand.CanExecuteChanged
    {
        add { }
        remove { }
    }
    public void Execute(object parameter)
    {
        _functionTree.PerformSearch();
    }
}
#endregion

搜索方法与类型无关。这取决于其特定模型中存在的类型。执行搜索所需的数据存在于此视图模型中。

这是有效的。现在,我必须将此功能扩展到其他具有自己的树视图(内容类型与FirstTreeView不同的其他视图(SecondListView,ThirdListView等(。我该怎么做?我应该把代码和命令放在哪里?

如何为多个视图模型实现相同的搜索功能

不要将业务逻辑放入 ViewModel 中。视图模型应该仅用于表示逻辑。

创建一个FamilyTreeSearchService并将其功能抽象到此服务中,然后将该服务注入到您的 ViewModels(即构造函数、依赖注入或服务定位器(中。从您的视图模型调用该服务。

1(正确的方法:

直接从公共抽象基类继承 ViewModel 类。 参考此堆栈溢出答案

2(简单的方法:

有一个单独的类命名,如"CommonViewModel">,并在其中包含公共代码。从 CommonViewModel 继承其他 ViewModel 类;

像下面一样,

public class CommonViewModel
{
....
}
public class FirstViewModel:CommonViewModel
{
....
}