棱镜 如何将模块视图绑定到应用范围的属性
本文关键字:应用 范围 属性 绑定 视图 模块 棱镜 | 更新日期: 2023-09-27 18:31:54
我知道这可能看起来很愚蠢,但是,使用 MVVM 和 Prism 绑定到应用程序范围属性的最佳方法是什么?
问题: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)
{
....
}
}
}
问题
这是最好的方法还是有更好的方法?
例如
使用
EventAggregator
和ConnectionStatusChangeEvent
订阅和发布连接中的更改?但是在这种情况下,如果有人在事件发布后(例如在线)订阅了该事件,他们将不会获得任何起始值,因此可以在开始时使用IStatusService
?使用
RegionContext
并将其绑定到Shell
中的Status
属性?但这似乎违背了Shell
不知道模块使用什么等的目的。
还是我完全错过了什么?
我已经阅读了整个 Prism(v4) 文档,但不能 100% 确定哪个是实现它的最佳方式。
我不喜欢ViewModels互相了解。我采用了您在例如#1中列出的方法 - 事件聚合器可帮助我移动信息。 我目前使用数据库连接和设置执行此操作,两者都在整个视图模型中使用。 我在第一次创建模型属性和更新时传递模型属性。
创建模型的视图模型订阅请求和更新请求,并发布响应。 因此,请求返回当前属性,UpdateRequest 将根据需要刷新或重新创建。
响应正在推送到任何侦听器 - 例如新创建的 ViewModel,其构造函数中具有请求的发布。这意味着构造函数不会初始化所有内容,您的 Response 侦听器将涵盖额外的工作,有时您可能需要等待多个响应才能完全初始化。
你问什么是最好的方法......——我觉得我的回答是对的,但要做适合你的项目的事情。我喜欢严格的 MVVM,但它并不总是那么严格。