2014-12-05 28 views
0

我有一个主视图,我有一个选项卡控件。每个选项卡的内容都是以不同视图呈现的树形视图。 这是我在其中使用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等),它们有自己的TreeView(内容的类型与FirstTreeView不同)。我该怎么做?我应该在哪里放置代码和命令?

+0

**“SearchFamiltyTreeCommand是从ICommand派生的类,execute方法调用执行搜索的函数。”** 这是单独编码的吗?如果是的话,我希望你可以在你的观点中单独使用它。 – 2014-12-05 05:35:51

+0

这存在于FirstViewModel中。我想我更好地添加该代码。 – 2014-12-05 05:39:02

回答

0

1)正确的方式:

直接从一个共同的抽象基类继承你的视图模型类。请参阅本Stackoverflow Answer

2)简单的方法:

有一个单独的类命名像“CommonViewModel”并在它的通用代码。从CommonViewModel继承您的其他ViewModel类;

像下面,

public class CommonViewModel 
{ 
.... 
} 

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

好的。所以你的意思是说在基类中添加一个命令?但是我不能将一个命令绑定到基类,因为数据上下文将是派生类。绑定不能做到datacontext的父对吗? – 2014-12-05 06:20:26

+0

1)你所有的ViewModel类都应该继承这个抽象类,以便它们分别包含Commands。 2)这些命令的执行逻辑可以放在一个单独的类(甚至服务)中,并且可以在每个ViewModel中访问这些方法。 – 2014-12-05 08:50:10

0

不要将业务逻辑转换的ViewModels。 ViewModels应该只用于表示逻辑。

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