2011-02-16 98 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