2011-06-14 25 views
3

我正在使用WPF並嘗試編寫MVVM方式。MVVM的澄清 - 視圖之間的交互

我明白每個視圖是如何擁有自己的視圖模型的,並且這種模式效果很好。儘管如此,我正在努力管理視圖之間的交互。

說我有兩個視圖View1和View2,每個都有自己的ViewModel,ViewModel1和ViewModel2。如果我在View1和按鈕上有一個組合框,關閉第一個視圖的正確方法是什麼,通知第二個視圖選擇並在按下按鈕後顯示第二個視圖?它似乎不應該在模型中出現,因爲它是一個UI的東西。 ViewModel不應該知道如何打開和關閉WPF窗體(或者應該如何?)並且視圖不應該知道任何其他ViewModel(或者他們應該?)

那麼這些問題是如何解決的?簡而言之:

1)數據如何在視圖之間傳遞?

2)什麼管理視圖的生命週期/可見性?

回答

1

這取決於您是在查看模型還是先查看,具體的實施細節取決於您是否使用MVVM framework。如果你不使用框架,那麼我強烈建議你開始使用它。

在您的示例中,當按下按鈕時,將調用ViewModel1上的方法。如果首先執行視圖模型(我會推薦),您將實例化一個ViewModel2的實例,此時您可以將組合框選擇傳遞給構造函數ViewModel2

根據您的框架,將會有不同的方式顯示與ViewModel2相關聯的視圖。

1

對於1)可以通過DataModel同步數據。假設每個視圖共享DataModel的相同實例並且它實現了INotifyPropertyChanged,則可以模擬更新多個視圖。

你的sesond問題是一個設計問題,因爲@ devdigital聲明它可以取決於它是先查看還是先查看模型。我會考慮引入一個Controller類,就像ASP.Net MVC的工作方式一樣,它控制顯示哪個視圖。您可以在控制器可以偵聽的ViewModel上公開ViewClosed事件,並根據您的工作流程打開另一個視圖。

1

你可能會考慮引入Controllers它們負責ViewModels的生命週期管理。此外,它們在ViewModels之間進行調解。

WPF Application Framework (WAF)的示例應用程序顯示瞭如何實現這些控制器。