我正在调查将PRISM 6.2用于与Visual Studio具有类似UI的应用程序。它还将是具有多个文档界面的对接窗口。我目前有一个工具栏区域和一个停靠区域。我设法让一些对接工作与自定义区域适配器。
我现在面临的设计问题是如何在全球范围内共享一个对象。
我的具体情况是用户可以从文件菜单中打开“解决方案”。那么'解决方案'就需要在'解决方案资源管理器'中,在'类视图'中,......我可以直截了当地开始考虑打开一个新的'解决方案',然后全部应使用新解决方案更新视图。关闭和重新创建似乎是一个糟糕的解决方案。
我想在ShellVM中有一个打开命令,它修改了停靠区域的regioncontext中的解决方案属性。然后,每个工具项目都可以监视该属性上的notifypropertychanged以进行更新。或者,如果尚未打开,请在创建时使用该属性。
但我不确定这个设置。这听起来有点像“上帝对象”。
我找到的另一种方法是:https://stackoverflow.com/a/40258147/4169986
拥有单一数据源,可将其作为服务提供给所有视图模型。
但是当我打开一个新的“解决方案”时,我并没有意识到如何将它与INotifyPropertyChanged结合起来。
PRISM的做法是什么和可取的?
非常感谢提前!
答案 0 :(得分:1)
单一数据源可以为您提供数据,而不是数据本身。想想这样的事情:
interface ISolutionProvider : INotifiyPropertyChanged
{
ISolution TheCurrentSolution
{
get;
}
}
需要当前ISolution
的所有视图模型都不会注入ISolutionProvider
,并且他们会通过_solutionProvider.TheCurrentSolution
访问解决方案。
如果有人更改了当前的解决方案,ISolutionProvider
将触发PropertyChanged
事件,视图模型会注意到这些更改并将其推送到他们的视图中。
请注意ISolutionProvider.TheCurrentSolution
没有设置器 - 因为我建议将该功能放在不同的界面中。该解决方案的大多数消费者要么想要阅读解决方案或关闭/打开/更改它,而不是两者。
此外,从视图模型监视ISolutionProvider.NotifyPropertyChanged
时,您需要确保在视图模型死亡时使用弱事件(最好)或至少断开事件处理程序,因为事件会保留视图模型alive(创建内存泄漏)。这个小gem在这里真的很方便......