棱镜如何将模块视图绑定到app wide属性

时间:2013-09-18 00:36:55

标签: c# design-patterns mvvm binding prism

我知道这看起来很愚蠢但是,使用MVVM和Prism绑定到Application Wide属性的最佳方法是什么?

问题ConnectionStatus Status {...}(实现INotifyPropertyChanged等..)

如何在特定模块中访问此属性?我希望能够在不同的模块中使用Status属性吗?

在不同模块之间获取此数据的最佳方法是什么?

解决方案

目前,我倾向于在基础架构项目中使用以下视图模型(跨模块共享)

namespace Project.Infrastructure 
{
    public class AppViewModel
    {
        public ConnectionStatus Status {...}
    }
}

在IoC中将AppViewModel定义为Singleton,并在ModuleViewModel

的构造函数中传递此内容
namespace Project.ModuleA 
{
    AppViewModel _appViewModel;

    public class ModuleViewModel
    {
        public ModuleViewModele(AppViewModel appViewModel)
        {
            ....
        }
    }
}

问题

这是最好的方法吗?或者有更好的方法吗?

E.g。

  1. 使用EventAggregatorConnectionStatusChangeEvent订阅并发布连接中的更改?但是在这种情况下,如果某人在发布后(例如在线)订阅了该事件,他们将无法获得任何起始值,因此可以在开始时使用IStatusService吗?

  2. 使用RegionContext并将其绑定到Status中的Shell属性?但这似乎打败了Shell不知道模块使用什么等的目的。

  3. 或者有什么东西我完全错过了吗?

    我已经阅读了整个Prism(v4)文档,并且不是100%确定哪个是实现它的最佳方式。

1 个答案:

答案 0 :(得分:1)

我不喜欢ViewModels彼此了解。我采用了你在E.g#1中列出的方法 - EventAggregator协助我为我移动信息。我目前使用数据库连接和设置执行此操作,两者都在整个视图模型中使用。我在第一次创建并更新后传递了模型属性。

创建模型的ViewModel订阅了Request和UpdateRequest,并发布了一个Response。因此,Request返回当前属性,UpdateRequest将根据需要刷新或重新创建。

响应正在推动任何侦听器 - 例如新创建的ViewModel,它在构造函数中发布了Request。这意味着构造函数不会初始化所有内容,您将让Response侦听器覆盖额外的工作,有时您可能需要等待多个响应才能完全初始化。


你问最好的方式是什么...... - 我觉得我的答案是正确的,但做了适合你项目的事情。我喜欢严格的MVVM,但它并不总是那么僵硬。