2010-08-11 418 views
3

我目前正在設計簡單的編輯器作爲學習過程的一部分。它基本上是多邊形 - 線 - 點的分層樹結構,它在數據模型中實現。我需要在兩種觀點wpf中的MVVM模式 - 一個數據模型,多個視圖模型

第一視圖中顯示這些數據:在樹視圖項分層數據 第二種觀點:在屏幕上

呈現幾何繼我已經實現圍繞數據模型模型視圖類MVVM模式(點模型視圖,線模型視圖等)。在樹狀視圖中,我使用分層數據模板來正確顯示特定數據。在第二個視圖中,我需要呈現當前狀態的幾何圖形,目前它只是一個圍繞多邊形數據類的模型視圖包裝器,它傳播所有子元素並將其呈現在onRender方法中。在這種情況下,我在相同的數據上使用了多個視圖模型,兩者用於完全不同的目的。

當我在樹視圖模型中進行一些修改(例如添加點)時會出現問題,導致底層數據模型發生更改。然而,第二視圖模型並不直接觀察模型視圖中的數據,只有在通過模型視圖類進行修改時纔會更新渲染視圖。是否有一些優雅的解決方案可以一致地更新兩個視圖模型?

回答

0

如果您必須對兩個視圖使用不同的視圖模型,那麼可以讓幾何視圖的視圖模型在層次視圖模型上訂閱PropertyChanged,或者您可以爲此公開不同的事件。這樣,幾何視圖模型將知道再次查看底層模型並自行更新。

如果您希望進一步解耦,可以使用Prism項目中提供的事件聚合器。

2

我通過介紹Presenter解決了這個問題。這裏的基本工作原理是:

  1. 我的域模型包含了過程的一些代表(稱之爲任務,工作流程,或其他)。它包含您正在執行的實際操作的「業務邏輯」。
  2. 我的演示者被告知顯示過程。
  3. 它實例化ViewModel(以及必要時的多個ViewModel),爲每個ViewModel提供一個對演示者(回調)的引用。
  4. 在實例化並顯示ViewModels之後,它將它們傳遞給模型的引用並告訴它們從中更新它們的狀態。
  5. ViewModels不保留對模型的直接引用。當他們想要採取行動時,他們使用回調到實例化時提供給他們的Presenter。演示者實際上對模型執行動作(過程,任務等)。
  6. 執行操作後,Presenter再次將對新更新模型的引用傳遞給所有ViewModel,指示它們刷新其狀態。

保持它們全部同步,而不需要任何ViewModel知道任何其他ViewModel。我的所有分層視圖模型都實現了一個接口IViewModelWithChildren,該接口公開IEnumerable<IViewModel>屬性,該屬性允許Presenter遍歷任何給定的ViewModel樹並通知所有這些樹,只要它具有對根ViewModel的引用即可。

我也喜歡它,因爲它通過單個點(Presenter回調)漏斗所有用戶操作,我可以在那裏注入某些問題。例如,如果在模型邏輯中發生了未處理的異常,我可以在那時捕獲它並實例化一個很好的MessageViewModel以顯示給用戶。