PRISM中的全局变量概念

时间:2017-03-08 19:50:22

标签: wpf mvvm prism

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

我现在面临的设计问题是如何在全球范围内共享一个对象。

我的具体情况是用户可以从文件菜单中打开“解决方案”。那么'解决方案'就需要在'解决方案资源管理器'中,在'类视图'中,......我可以直截了当地开始考虑打开一个新的'解决方案',然后全部应使用新解决方案更新视图。关闭和重新创建似乎是一个糟糕的解决方案。

我想在ShellVM中有一个打开命令,它修改了停靠区域的regioncontext中的解决方案属性。然后,每个工具项目都可以监视该属性上的notifypropertychanged以进行更新。或者,如果尚未打开,请在创建时使用该属性。

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

我找到的另一种方法是:https://stackoverflow.com/a/40258147/4169986

  

拥有单一数据源,可将其作为服务提供给所有视图模型。

但是当我打开一个新的“解决方案”时,我并没有意识到如何将它与INotifyPropertyChanged结合起来。

PRISM的做法是什么和可取的?

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

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

interface ISolutionProvider : INotifiyPropertyChanged
{
    ISolution TheCurrentSolution
    {
        get;
    }
}

需要当前ISolution的所有视图模型都不会注入ISolutionProvider,并且他们会通过_solutionProvider.TheCurrentSolution访问解决方案。

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

请注意ISolutionProvider.TheCurrentSolution没有设置器 - 因为我建议将该功能放在不同的界面中。该解决方案的大多数消费者要么想要阅读解决方案关闭/打开/更改它,而不是两者。

此外,从视图模型监视ISolutionProvider.NotifyPropertyChanged时,您需要确保在视图模型死亡时使用弱事件(最好)或至少断开事件处理程序,因为事件会保留视图模型alive(创建内存泄漏)。这个小gem在这里真的很方便......