2013-10-22 76 views
7

我的程序由TreeView和兩個在地面的contentPresenters組成。主窗口TreeView和每個contentPresenter都有自己的viewModels。如何從其他視圖模型調用主視圖模型中的函數?

我想從TreeViewViewModel調用mainWindowViewModel中的函數。

我需要這樣做,因爲mainWindowViewModel控制在contentPresenters顯示什麼,我想手動更新顯示。

我猜我會做這樣的事情...

TreeViewViewModel

public class TreeViewViewModel 
{ 
    //Do I need to declare the MainWindowVM? 

    public TreeViewViewModel() { ... } 

    private void function() 
    { 
      //Command that affects display 

      //Manually call function in MainWindowVM to refresh View 
    } 
} 

我試圖通過使用獲得從TreeViewViewModel訪問MainWindowVM

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } } 

但它沒有多大意義。因爲MWVM不是TreeViewViewModelDataContext

回答

10

此方法和鏈接答案中使用的delegate方法可用於任何父子關係和任一方向。這包括從子視圖模型到父視圖模型,隱藏子代Window後面的代碼的Window代碼,甚至包含沒有涉及任何UI的純數據關係。您可以在MSDN上找到有關使用Delegates (C# Programming Guide)頁面中的delegate對象的更多信息。

我剛剛在今天早些時候回答了類似的問題。如果你看一下Passing parameters between viewmodels文章,你會發現答案涉及到使用delegate對象。您可以簡單地將這些delegate(從答案中)替換爲您的方法,並以相同的方式工作。

如果您有任何問題,請讓我知道。


UPDATE >>>

是的,對不起,我完全忘了你想,而不是調用方法......我一直在今晚的工作太多的文章。所以仍然使用從其他職位的例子中,只需要調用你的方法在ParameterViewModel_OnParameterChange處理程序:在delegate

public void ParameterViewModel_OnParameterChange(string parameter) 
{ 
    // Call your method here 
} 

想象成你的路徑返回到父視圖模型......這就像引發一個事件稱爲ReadyForYouToCallMethodNow.事實上,你甚至不需要輸入參數。你可以定義你delegate是這樣的:(在其他例子連接處理程序等之後)

public delegate void ReadyForUpdate(); 

public ReadyForUpdate OnReadyForUpdate { get; set; } 

然後在父視圖模式:

public void ChildViewModel_OnReadyForUpdate() 
{ 
    // Call your method here 
    UpdateDisplay(); 
} 

當你有多個子視圖模型,你可以在另一個他們都有權訪問的類中定義delegate。如果您還有其他問題,請告訴我。


更新2 >>>

再次閱讀你最後的評論之後,我只是想一個更簡單的方法,那可能實現你想要的......至少,如果我沒有理解你正確。您可以直接從您的子視圖Bind到您的父視圖模型。例如,這將允許你Bind在子視圖Button.Command屬性的ICommand財產在父視圖模型:

TreeViewView

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" /> 

這當然假定父母的一個實例有問題的查看模型被設置爲MainWindowDataContext

+0

這個答案唯一不同於我所做的是mainWindowViewModel是父視圖模型,這是我試圖調用。這是如何改變這個解決方案的? –

+0

使用另一篇文章中的例子,你將在'MainWindowViewModel'類中有一個'ParameterViewModel_OnParameterChange'處理方法。唯一的區別是你在那個處理程序中的更新已經在你想要的地方(在父視圖模型中),所以你不需要將這個'parameter'傳遞給另一個子視圖模型......有效地,你可以使用相同的示例,但只需按照「ParameterViewModel_OnParameterChange」處理程序中的值進行操作,而不是將其傳遞給其他視圖模型。 – Sheridan

+0

這似乎是關於將值傳遞給其他ViewModels並更改參數值。我只想從另一個ViewModel中的'Command'/Function調用'mainWindowViewModel'中的函數。 MWVM中我調用的函數只是根據選擇的內容更改'contentPresenter'中提供的內容。 –

相關問題