【问题标题】:How do I implement the same search functionality for multiple view models?如何为多个视图模型实现相同的搜索功能?
【发布时间】:2014-12-05 05:21:33
【问题描述】:

我有一个主视图,其中有一个选项卡控件。每个选项卡的内容是一个树视图,存在于不同的视图中。 这是我使用其他 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 的类,execute 方法调用一个函数来执行搜索。这存在于 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 等)。我该怎么做?我应该把代码和命令放在哪里?

【问题讨论】:

  • “SearchFamiltyTreeCommand 是一个派生自 ICommand 的类,execute 方法调用一个函数来执行搜索。” 这是单独编码的吗?如果是的话,我希望你可以在你的视图中单独使用它。
  • 这存在于 FirstViewModel 中。我想我最好也添加该代码。

标签: c# wpf xaml mvvm treeview


【解决方案1】:

不要将业务逻辑放入 ViewModel。 ViewModel 应该只用于表示逻辑。

创建一个FamilyTreeSearchService 并将其功能抽象到该服务中,然后将该服务注入到您的 ViewModel 中(即构造函数、依赖注入或 ServiceLocator)。从您的 ViewModel 调用服务。

【讨论】:

    【解决方案2】:

    1) 正确方法:

    直接从通用抽象基类继承您的 ViewModel 类。参考这个Stackoverflow Answer

    2) 简单方法:

    有一个单独的类命名,如 'CommonViewModel' 并在其中包含通用代码。从 CommonViewModel 继承您的其他 ViewModel 类;

    如下所示,

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

    【讨论】:

    • 好的。所以你的意思是在基类中添加一个命令?但是我不能将命令绑定到基类,因为数据上下文将是派生类。不能对数据上下文的父级进行绑定吗?
    • 1) 您的所有 ViewModel 类都应该继承该抽象类,以便它们分别包含命令。 2)这些命令的实现逻辑可以放在一个单独的类(甚至服务)中,并且可以在每个 ViewModel 中访问这些方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 2021-12-26
    相关资源
    最近更新 更多