PRISM 中的全局变量概念
Global variable concept in PRISM
我正在研究将 PRISM 6.2 用于具有类似于 UI 至 Visual Studio 的应用程序。还将对接window多文档界面。我目前有一个工具栏区域和一个停靠区域。我已经设法让一些对接与自定义区域适配器一起工作。
我现在面临的设计问题是如何全局共享一个对象。
我的具体情况是用户可以从文件菜单中打开 'solution'。然后在“解决方案资源管理器”VM 中需要 'solution',在“class 视图”VM 中,...在我开始考虑打开一个新的'solution',则应使用新解决方案更新所有视图。关闭并重新创建似乎是一个蹩脚的解决方案。
我正在考虑在 ShellVM 中使用一个打开命令来修改对接区域的区域上下文中的解决方案 属性。然后,每个工具项都可以监视 属性 上的通知 属性 更改以进行更新。或者,如果尚未打开,请在创建时使用 属性。
不过我不确定这个设置。听起来有点像"god object"。
我发现的另一种方法是:
Have a single source of data, make it available to all your view models as a service.
但我不明白如何在打开新 'solution' 时将其与 INotifyPropertyChanged 结合使用。
执行此操作的 PRISM 方法是什么?
非常感谢!
单一数据源可以为您提供数据,而不是数据本身。想想这样的事情:
interface ISolutionProvider : INotifiyPropertyChanged
{
ISolution TheCurrentSolution
{
get;
}
}
所有需要当前 ISolution
的视图模型都没有注入,而是 ISolutionProvider
,它们通过 _solutionProvider.TheCurrentSolution
.
访问解决方案
如果有人更改了当前解决方案,ISolutionProvider
会触发 PropertyChanged
事件,视图模型会注意到更改并将它们推送到它们的视图。
请注意 ISolutionProvider.TheCurrentSolution
没有 setter - 那是因为我建议将该功能放在不同的界面中。该解决方案的大多数消费者要么想阅读解决方案 要么 close/open/change,但不会同时阅读。
此外,当从视图模型中监视 ISolutionProvider.NotifyPropertyChanged
时,您需要确保使用弱事件(最好)或至少在视图模型结束时断开事件处理程序,否则事件会保留视图模型还活着(造成内存泄漏)。这个 gem 在这里非常方便...
我正在研究将 PRISM 6.2 用于具有类似于 UI 至 Visual Studio 的应用程序。还将对接window多文档界面。我目前有一个工具栏区域和一个停靠区域。我已经设法让一些对接与自定义区域适配器一起工作。
我现在面临的设计问题是如何全局共享一个对象。
我的具体情况是用户可以从文件菜单中打开 'solution'。然后在“解决方案资源管理器”VM 中需要 'solution',在“class 视图”VM 中,...在我开始考虑打开一个新的'solution',则应使用新解决方案更新所有视图。关闭并重新创建似乎是一个蹩脚的解决方案。
我正在考虑在 ShellVM 中使用一个打开命令来修改对接区域的区域上下文中的解决方案 属性。然后,每个工具项都可以监视 属性 上的通知 属性 更改以进行更新。或者,如果尚未打开,请在创建时使用 属性。
不过我不确定这个设置。听起来有点像"god object"。
我发现的另一种方法是:
Have a single source of data, make it available to all your view models as a service.
但我不明白如何在打开新 'solution' 时将其与 INotifyPropertyChanged 结合使用。
执行此操作的 PRISM 方法是什么?
非常感谢!
单一数据源可以为您提供数据,而不是数据本身。想想这样的事情:
interface ISolutionProvider : INotifiyPropertyChanged
{
ISolution TheCurrentSolution
{
get;
}
}
所有需要当前 ISolution
的视图模型都没有注入,而是 ISolutionProvider
,它们通过 _solutionProvider.TheCurrentSolution
.
如果有人更改了当前解决方案,ISolutionProvider
会触发 PropertyChanged
事件,视图模型会注意到更改并将它们推送到它们的视图。
请注意 ISolutionProvider.TheCurrentSolution
没有 setter - 那是因为我建议将该功能放在不同的界面中。该解决方案的大多数消费者要么想阅读解决方案 要么 close/open/change,但不会同时阅读。
此外,当从视图模型中监视 ISolutionProvider.NotifyPropertyChanged
时,您需要确保使用弱事件(最好)或至少在视图模型结束时断开事件处理程序,否则事件会保留视图模型还活着(造成内存泄漏)。这个 gem 在这里非常方便...