2011-02-16 63 views
2

想象一下,您有一個複雜的數據對象。編輯對象的各種屬性足夠複雜,用戶最好擁有多個屏幕。它本質上是配置項目的購物車。WPF - MVVM屏幕管理

因此,一個屏幕將允許您添加項目。 另一個將允許您添加對這些項目的修改,這些修改與成本相關。 第三個屏幕將允許您爲物品配置全局設置。因爲我確信你可以猜到,每個屏幕都在同一個購物車上運行,只是改變了內部物品的不同屬性和關係。

所以,我們要儘量寫使用MVVM應用程序,並在討論各種屏幕(以及它們之間的導航),我們得出了以下問題:

如何人一般管理應用程序使用MVVM時的狀態?用戶用來改變屏幕的導航欄將存在於屏幕之外,但是當用戶點擊它時,人們用什麼常用的方法來隱藏和顯示另一個?

更一般地說,人們如何處理全局應用程序狀態?用戶一次只能在一個手推車上操作,一次只能有一個用戶登錄,一次只能顯示一個屏幕。最好是創建一個存儲這些重要屬性的單例,ViewModel可以保存它們的副本並通過事件聚合器訂閱更改?如你所知,我幾乎不知道該從哪裏開始解決這個問題,所以任何建議都是受歡迎的。

回答

3

我會使用ViewModels來跟蹤應用程序狀態。

One ViewModel控制整個應用程序,並處理用戶當前所處的頁面。應用程序本身綁定到主ViewModel,並且大部分應用程序屏幕空間都是綁定到ViewModel.CurrentPage的ContentControl。 DataTemplates然後用於確定哪個視圖顯示用戶當前正在打開的任何頁面

過去,我對某些對象(例如當前用戶)使用了全局單例,並且ViewModel使用對此的引用if需要。所以如果我想在頁面上顯示UserName,我會在ViewModel中有一個名爲UserName的屬性,它返回Global.Instance.CurrentUser.UserName

1

對於您的類型的情況,我會查看PRISM。 PRISM是以鬆散耦合的MVVM方式開發WPF應用程序的模式集合。

PRISM Region Manager Example

具體而言,您對多屏幕的例子和管理應用程序狀態,使用「控制器」,爲您的視圖模型(車)的各種表示的意見,加載到獨立的「區域」可能是一個好的開始。看起來在MSDN上有一篇關於getting started with PRISM的精彩文章,其中包括composing user interfaces(Regions)。

+0

我只會補充說,如果你不需要,你不必使用PRISM的全部。有時候DI容器對於小型應用程序來說可能有點多。 – Jacob 2011-02-16 19:13:26