2014-12-05 62 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調用服務。