2013-04-08 49 views
1

我的工作是由以下幾個部分的應用的領域:視圖模型到視圖模型通信

  • 資源管理器 - 包含一個TreeView
  • PropertyInspector - 包含PropertyGrid的
  • 編輯器 - 包含一個資源管理器和一個PropertyInspector

正如您所看到的,這些零件是以分層方式組織的。我的問題是: 如何使資源管理器使用的樹視圖中的選定項目屬性檢查器使用的屬性網格的選定對象?

當樹視圖引發SelectedItemChanged事件時,會將命令發送到ExplorerViewModel。 PropertyGrids SelectedObject綁定到PropertyInspectorViewModel上的一個屬性。我如何連接兩個視圖模型?一種方法是讓EditorViewModel將PropertyInspectorViewModel上的方法附加到ExplorerViewModel在接收到命令時引發的事件,但是這種方式還是可以通過數據綁定以某種方式解決?

編輯器不直接使用樹視圖和屬性網格的原因是因爲資源管理器和屬性檢查器連同所有的撤銷/重做功能,驗證代碼等都是要在其他區域重用的原因。

+0

搜索RelayCommand實現, 比您在執行命令的發佈商一個虛擬機,並在訂閱者執行它。 我稍後會發佈一個真正的實現。僅供參考,您的粗獷邏輯毫無興趣嘗試從技術角度解決問題 – 2013-04-08 19:43:49

回答

0

我強烈推薦使用MVVM框架。我有類似的要求,並決定採用Tony Sneed's Simple MVVM Toolkit。它非常輕巧,記錄非常詳細,易於理解,提供了非常有用的功能,並且基本上確實爲您提供了MVVM管道。

你在這種情況下,需要的是利用消息總線的特點:

MessageBus

有時你需要通過視圖模型中的消息在應用程序中一個很好的例子當你想根據一些商業邏輯導航到一個特定的視圖時,直接從另一個視圖模型引用主視圖模型並不是一個好主意,這樣做會在視圖模型之間產生相互依賴關係,這將會很困難維持(一種現象稱爲意大利麪代碼),這是一個消息總線(也稱爲事件我分配器或聚合器)派上用場。例如,CustomerViewModel可以使用特定的令牌向消息總線發送消息,並且當有人使用相同的令牌向消息總線發送消息時,MainPageViewModel可以訂閱接收消息。消息令牌只是可以在類中定義爲常量的字符串。From the Programming Reference page

除此之外我還用Josh Smith's RelayCommand簡化ICommand通知作爲@eran otzap建議

0

編輯VM應協調兩個孩子的VM。

添加所選項目物業資源管理器VM (如果它不存在)並確保它觸發財產變更通知

屬性檢查器VM應該有一個類似的屬性,它是要顯示屬性的項目。

編輯器然後觀察資源管理器VM的選定項目屬性的更改,並在更改時將新項目傳遞給屬性檢查器VM。

這裏沒有必要涉及到消息總線。消息總線用於鬆散耦合的ViewModel以將消息傳遞給對方。例如應用程序範圍通知文件已被打開。

如果你在這裏使用了一個消息總線,那麼任何重用的虛擬機也會觸發消息,這不是你想要的。