【问题标题】:Composite events in locally scoped regions with Prism (CAL)使用 Prism (CAL) 在局部范围内的复合事件
【发布时间】:2010-03-12 09:10:36
【问题描述】:

我开始用一个小应用程序训练 Prism (CAL),但遇到了一些问题。

我正在创建 MainView 的多个实例,它本身包含一些区域,并在 Shell 中显示它们。 我正在使用本地范围的区域来轻松处理 MainView 中的视图注入。

目前我正在寻找一种在 MainView 内的视图(viewModels)之间进行通信的方式。复合事件可以做到这一点,但是当我发布这些事件时,它们会在我的 MainView 的所有实例中处理,这我真的不想要。

有没有办法像本地范围的区域一样引发“本地范围的”复合事件?或者在我的情况下,是否有更好的方式在视图之间进行通信?

【问题讨论】:

    标签: c# prism


    【解决方案1】:

    还可以创建本地范围的 EventAggregator 并在子 UnityContainer 中注册,在 MainView 中创建(在同一位置,创建本地范围的区域)。

    这相当于一个局部范围的区域恕我直言。

    【讨论】:

      【解决方案2】:

      将表单发送者作为参数传递。 (无论如何,必须有一种方法来区分您的应用程序的窗口 - 使用它。)当您收到事件时,检查当前表单 ReferenceEquals 是否与发送者相同(或者,检查表单'key')。

      【讨论】:

      • 谢谢,我正在考虑使用密钥作为事件参数之一。我只是想知道,如果我在每个小区域中到处都有复合事件,它会影响整个应用程序的性能吗..
      • 一旦您将事件触发到全局事件标记聚合器,每个订阅者都必须解决它。所以答案是“不是在每个小区域,而只是在区域订阅者中”
      【解决方案3】:

      经过多次讨论,最终选择了 EventAggregator。与其他人分享,以防他们处于相同的情况,我们的思考过程可能会帮助他们:

      (问题说明:参考我之前的评论)

      主视图 (ViewModel) 具有用于保存来自其他模块的视图的区域并且还形成 TabItem 视图,它负责清理自身及其包含的子视图。因此,在 TabItem 关闭事件中,这个主视图 (ViewModel) 应该通知其子视图正常关闭。

      EventAggregator 和 .Net Eventing 都从各个方面进行了深入探索,作为发送关闭消息的潜在候选者。

      由于在 Prism 解耦环境中,主视图在技术上应该不知道其子视图,反之亦然,因此选择了 EventAggregator。

      事件聚合器的一个问题是它会将事件发布到整个应用程序,但我们的要求是过滤来自正在关闭的 tabitemview 的事件。 EventAggregator 被设计为使用过滤器来验证关闭请求是否来自同一个 tabitemview(我们为每个 tabItem 使用了作用域区域管理器,并且这个作用域区域管理器被用作过滤器),然后它才执行关闭操作。这确保了在一个选项卡中触发关闭不会关闭其他选项卡中恰好具有相同区域名称的子视图。

      谢谢, RDV

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 2017-03-05
        • 2016-11-13
        • 1970-01-01
        • 2011-09-14
        • 1970-01-01
        相关资源
        最近更新 更多