【问题标题】:Event aggregator for conditional actions条件操作的事件聚合器
【发布时间】:2012-06-20 23:44:36
【问题描述】:

我参与了 WPF Prism 应用程序的开发,该应用程序使用事件聚合器发送全局类型消息,然后由 shell 接收。例如,一个视图模型可能希望显示一个 toast 消息,但并不真正关心它是如何显示的。在这种情况下,shell 将被设置为处理这些事件并在应用程序范围内对它们采取行动。

我的问题是,如果特定视图想要以不同方式显示 toast 消息,你该怎么做。我喜欢全局方法,因为它非常简单,但是如何针对特殊情况进行自定义呢?

【问题讨论】:

    标签: prism toast eventaggregator


    【解决方案1】:

    我认为这实际上取决于您的应用程序的设置方式以及您使用的标准/模式。在 MVVM 中,我看到了两种方法。

    查看优先
    如果您的 View-Model 被注入到您的视图中,则将消息发送到您的视图,并让视图决定如何处理它。如果它想自己显示它们,它可以做到这一点。如果它想将它们发送到您的 shell,它可以通过事件聚合器或注入 Toast 服务接口来实现。这样可以让您的视图控制视觉效果。

    查看模型优先
    如果您的视图被注入到您的视图模型中,那么您的视图模型应该要求一个不同的视图,该视图应该绑定到它自己的视图模型。如果它想向另一个视图模型发送消息,它可以通过事件聚合器或注入 Toast 视图模型/服务接口来实现。这样可以让您的 View-Model 控制 View 之间的导航。

    我更喜欢 View-First 方法,因为它可以让您的 View 控制模型的可视化。但我对其他 MVVM 开发人员如何解决这个问题非常感兴趣。这似乎与如何在 MVVM 视图优先方法中呈现对话框的问题非常吻合。

    【讨论】:

      【解决方案2】:

      为此使用 Eventtaggregator 并不是我认为的正确方式,因为事件会广播到整个应用程序。

      处理该场景的一种可能方法是您的视图模型可以在构造函数中注入一个 IMessenger 接口。 IMessenger 有一个应用程序实现(默认注入),您可以根据需要自定义 IMessenger 的实现。你的viewmodel只是调用了一个接口函数(比如DisplayMessage()),但是根据注入它的Messenger,行为是不同的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多