我开始用一个小应用程序训练Prism(CAL)并遇到一些问题。
我正在创建MainView的多个实例,它本身包含一些区域,并在Shell中显示它们。 我正在使用本地作用域来轻松处理MainView中的视图注入。
目前,我正在寻找MainView内部视图(viewModels)之间的通信方式。复合事件可以做到这一点,但是当我发布这些事件时,它们会在我的MainView的所有实例中处理,我真的不想这样做。
有没有办法像本地范围区域一样提高“本地范围”的复合事件?或者在我的案例中可能有更好的方式在视图之间进行通信?
答案 0 :(得分:1)
也可以创建本地范围的EventAggregator,并在MainView中创建的子UnityContainer中注册(在创建本地作用域的同一位置)。
这相当于本地范围内的区域。
答案 1 :(得分:0)
将表单发件人作为参数传递。 (无论如何,必须有一种方法来区分你的应用程序的窗口 - 使用它。)当你收到事件时,检查当前表格ReferenceEquals是否发送给发件人(或者,检查表格'key')。
答案 2 :(得分:0)
经过多次讨论,选择了EventAggregator。与他人分享以防他们处于相同的情况,我们的思考过程可能会对他们有所帮助:
(问题陈述:请参阅我之前的评论)
主视图(ViewModel)具有保存其他模块视图的区域,并且还构成TabItem视图,负责清理自身及其包含的子视图。因此,在TabItem关闭事件中,此主视图(ViewModel)应通知其子视图正常关闭。
从各个方面彻底探索了EventAggregator和.Net Eventing作为发送关闭消息的潜在候选者。
因为,在Prism解耦环境中,主视图应该在技术上不知道它的子视图,反之亦然,选择了EventAggregator。
事件聚合器的一个问题是它将事件发布到整个应用程序,但我们的要求是过滤来自tabitemview的事件被关闭。 EventAggregator旨在使用过滤器来验证关闭请求是否来自相同的tabitemview(我们对每个tabItem使用了scoped regionmanager,并且此范围区域管理器用作过滤器),然后它才执行关闭操作。这可确保在一个选项卡中触发关闭不会关闭恰好具有相同区域名称的其他选项卡中的子视图。
谢谢, RDV