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

时间:2014-12-05 05:21:33

标签: c# wpf xaml mvvm treeview

我有一个主视图,其中有一个制表符控件。每个选项卡的内容是树视图,它存在于不同的视图中。 这是我使用其他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

搜索方法不是类型独立的。它取决于其特定模型中存在的类型。此视图模型中存在执行搜索所需的数据。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

1)正确的方法:

直接从公共抽象基类继承ViewModel类。请参阅此Stackoverflow Answer

2)简单方法:

有一个单独的类命名,如&#39; CommonViewModel&#39; ,并在其中包含公共代码。从 CommonViewModel ;

继承您的其他ViewModel类

如下所示,

public class CommonViewModel
{
....
}

public class FirstViewModel:CommonViewModel
{
....
}