2012-01-10 87 views
2

我有一個嵌套WPF UserControl的UI,每個都有自己的視圖模型。視圖(XAML)層次結構的一種簡單的情況下將是:撰寫WPF視圖和MVVM視圖模型

MainWindow 
    |-> Logical group 
     |-> Logical control 
    |-> Second logical group 
    |-> Third logical group 
     |-> Logical control 

每個XAML視圖都有一個ViewModel它封裝交互邏輯。我的問題是關於從父視圖模型到子視圖模型的ViewModel狀態。

例如,MainWindow中的用戶交互可以在MainWindowViewModel中設置CurrentlySelectedGroup變量。我需要知道LogicalControlViewModel裏面有什麼值。

我正在考慮這樣做的兩種主要方式。首先,我可以播放一個事件DispatchGroupSelected,然後在LogicalControlViewModel內部指定一個代表作爲該事件的監聽者。第二,我可以在LogicalControlViewModel裏面Bind到的CurrentlySelectedGroup屬性。

我的第一個直覺是使用事件在父視圖模型和子視圖模型之間進行通信。我認爲綁定最好保持在View Model和View之間。直到現在的事件已被用於我的ViewModel和命令之間的通信。如果還有另一個可能的方向,那就更好了,我很樂意聽到它。

回答

1

你試過用信息總線嗎?有幾個框架在那裏實現了這個模式:

  • PRISM,有它的EventAggregator在這裏你可以定義一個合同,然後發送和接收它後面的通知。
  • MVVM Light,也有一個MessageBus,你可以瞭解它here
  • RectiveUI,這是我最喜歡的,它結合了Reactive Extensions Observable的功能和Message Bus模式,可以找到一些文檔here

使用此模式,您的ViewModels可以以鬆散耦合的方式與其他模塊交流,因爲每個ViewModel只是發送一條消息,並不在乎誰會監聽它。如果ViewModel想要偵聽特定的消息類型,它可以訂閱只獲取這些消息。

+0

當我說我正在考慮廣播事件時,我實際上正在考慮沿着消息總線的方向。我有一個單獨的Broadcaster類,它有一個委託列表,一個事件列表和一個DispatchEvent調用列表。我使用Ninject將廣播器注入到所有View Models中。到目前爲止,廣播公司主要用於註冊觀看模型以收聽命令的結果。我已經重新使用該中央廣播公司在視圖模型之間進行通信。我認爲這對我的小應用來說足夠乾淨,儘管我會考慮在較大的應用上爲View Models編寫特定的廣播器 – 2012-01-11 19:21:49