Wpf PRISM中的全局变量概念

Wpf PRISM中的全局变量概念,wpf,mvvm,prism,Wpf,Mvvm,Prism,我正在研究将PRISM 6.2用于一个与Visual Studio具有类似UI的应用程序。它还将是具有多文档界面的停靠窗口。我目前有一个工具栏区域和一个停靠区域。我已经设法让一些对接与自定义区域适配器一起工作 我现在面临的设计问题是如何全局共享对象 具体情况是,用户可以从文件菜单打开“解决方案”。然后在“解决方案资源管理器”虚拟机、“类视图”虚拟机中需要该“解决方案”,。。。当我开始考虑打开一个新的“解决方案”时,我就可以开始思考,然后所有视图都应该用新的解决方案更新。关闭和重新创建似乎是一个糟

我正在研究将PRISM 6.2用于一个与Visual Studio具有类似UI的应用程序。它还将是具有多文档界面的停靠窗口。我目前有一个工具栏区域和一个停靠区域。我已经设法让一些对接与自定义区域适配器一起工作

我现在面临的设计问题是如何全局共享对象

具体情况是,用户可以从文件菜单打开“解决方案”。然后在“解决方案资源管理器”虚拟机、“类视图”虚拟机中需要该“解决方案”,。。。当我开始考虑打开一个新的“解决方案”时,我就可以开始思考,然后所有视图都应该用新的解决方案更新。关闭和重新创建似乎是一个糟糕的解决方案

我正在考虑在ShellVM中使用open命令来修改停靠区域regioncontext中的解决方案属性。然后,每个工具项都可以监视要更新的属性上的notifypropertychanged。或者,如果尚未打开,请在创建时使用该属性

但是,我不确定这个设置。这听起来有点像“上帝的对象”

我发现的另一种方法是:

只有一个数据源,将其作为服务提供给所有视图模型

但我没有掌握如何在打开新“解决方案”时将其与InotifyProperty更改相结合

做这件事的最佳方法是什么


非常感谢

单一数据源可以为您提供数据,而不是数据本身。想想这样的事情:

interface ISolutionProvider : INotifiyPropertyChanged
{
    ISolution TheCurrentSolution
    {
        get;
    }
}
所有需要当前
ISolution
的视图模型都不会被注入,而是注入
ISolutionProvider
,它们通过
\u solutionProvider.the current solution
访问解决方案

如果有人更改当前解决方案,
ISolutionProvider
将触发
PropertyChanged
事件,视图模型将注意到这些更改并将其推送到视图中

请注意,
ISolutionProvider。当前解决方案没有setter-这是因为我建议将该功能放在不同的接口中。解决方案的大多数消费者要么想阅读解决方案,要么想关闭/打开/更改解决方案,但不是两者都想


此外,当从视图模型监视
ISolutionProvider.NotifyPropertyChanged
时,您需要确保使用弱事件(最好)或在视图模型死亡时至少断开事件处理程序,因为否则该事件将使视图模型保持活动状态(造成内存泄漏)。这一点在这里非常方便…

您可以使用一个共享的单例服务,将其注入视图模型中: