2013-02-19 18 views
3

我希望有一個關於MVVM的簡單的,雖然有人設想的問題。MVVM - 視圖是否應該影響MainWindow ViewModel?

我的主窗口有1個控件 - ContentControl顯示其中一個只有2個視圖。我希望能夠通過按鈕在2個視圖之間切換。問題是,按鈕將是每個視圖上的控件。 EG View1有一個按鈕,View2有一個按鈕。在用戶界面上只顯示一個視圖,通過單擊該按鈕將顯示另一個視圖。然而,爲了這個工作,這將意味着視圖的ViewModel必須知道MainWindow的ViewModel以便更改視圖。這似乎是錯誤的。

問題可能是我的MainWindow ViewModel。其中一個項目是公共對象View {get; set},這是綁定到MainWindows ContentControl的東西。所以,這是需要從View的視圖模型更新的屬性。

如果View更新了MainWindow的ViewModel,它是否違背了MVVM模式?

回答

3

我不確定我是否完全理解你的問題,但是在視圖模型之間進行通信的好技術是通過EventAggregator或者Messenger模式。 這兩個實現pub/sub以鬆散耦合的方式。

這是MVVMLight工具包的使者 http://dotnet.dzone.com/articles/mvvm-light-whats-messenger

的例子這是棱鏡的EventAggregator的例子viemodels之間communictate http://rachel53461.wordpress.com/2011/06/05/communication-between-viewmodels-with-mvvm/

希望這有助於..

編輯:好吧,我的回答仍然有效。如果你使用上面提到的pub/sub,你會告訴view1view2發送一個改變視圖消息,例如定義一個目標(例如目標可能是view2)。然後,您將在您的MainViewModel中訂閱每個更改查看消息。當更改視圖消息到達時。 MainViewModel得到通知並執行一個事件,並不一定要知道誰發送了該消息。

記住MVVM只是一個模式不是一種宗教......只是使用讓你去,並在你的頭=)背面圖案的東西...

+0

我更新了我的問題,這可能會使問題變得更清晰。感謝您的鏈接。 – Dave 2013-02-19 11:32:53

1

您的視圖模型不應該理想地參考視圖。 If you're doing MVVM then you really need to use an MVVM framework。你所描述的似乎是一個正在進行其他兩種視圖模型的視圖模型。

就個人而言,如果只有一個用戶對消息感興趣(在本例中爲父主視圖模型),我不會使用事件聚合器。如果你想要鬆耦合,你可以使用普通的.NET事件並應用標準事件模式。

您的主視圖模型將持有對兩個子視圖模型的引用,並將訂閱其啓動切換的事件。當在子1上點擊該按鈕時,它調用它的事件,並且主視圖模型然後將其事件處理器中的當前視圖切換到子項2.

使用諸如Caliburn.Micro的MVVM框架這是非常容易的。您的主視圖模型將爲Conductor類型,然後您只需更改ActiveItem即可。