Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为多个视图模型实现相同的搜索功能?_C#_Wpf_Xaml_Mvvm_Treeview - Fatal编程技术网

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

C# 如何为多个视图模型实现相同的搜索功能?,c#,wpf,xaml,mvvm,treeview,C#,Wpf,Xaml,Mvvm,Treeview,我有一个主视图,其中有一个选项卡控件。每个选项卡的内容都是一个树状视图,呈现在不同的视图中。 这是我的主要视图,其中我使用了另外两个视图 在我的第一个列表视图中,我有一个树视图、一个文本框和一个按钮 <TabControl x:Name ="MainTab" SelectionChanged="OnTabSelectionChanged"> <TabItem Header="First" > <view:FirstListView x:Nam

我有一个主视图,其中有一个选项卡控件。每个选项卡的内容都是一个树状视图,呈现在不同的视图中。 这是我的主要视图,其中我使用了另外两个视图

在我的第一个列表视图中,我有一个树视图、一个文本框和一个按钮

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

SearchFamilityTreeCommand是从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
搜索方法与类型无关。这取决于其特定型号中存在的类型。执行搜索所需的数据显示在此视图模型中

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

1)正确的方式:

直接从公共抽象基类继承ViewModel类。参考此

2) 简单方法:

有一个单独的类命名,如“CommonViewModel”,并在其中包含公共代码。从CommonViewModel继承附加的ViewModel类

如下图所示

public class CommonViewModel
{
....
}

public class FirstViewModel:CommonViewModel
{
....
}

不要将业务逻辑放在ViewModels中。ViewModels应仅用于表示逻辑


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

“SearchFamilityTreeCommand是从ICommand派生的类,execute方法调用函数来执行搜索。”这是单独编码的吗?如果是,我希望您可以在视图中单独使用它。这在FirstViewModel中显示。我想我最好也加上那个代码。你的意思是在基类中添加一个命令?但是我不能将命令绑定到基类,因为数据上下文将是派生类。无法对datacontext的父级进行绑定?1)所有ViewModel类都应继承该抽象类,以便它们分别包含命令。2) 这些命令的实现逻辑可以放在单独的类(甚至是服务)中,并且这些方法可以在每个ViewModel中访问。
public class CommonViewModel
{
....
}

public class FirstViewModel:CommonViewModel
{
....
}