我参与了 WPF Prism 应用程序的开发,该应用程序使用事件聚合器发送全局类型消息,然后由 shell 接收。例如,一个视图模型可能希望显示一条 toast 消息,但并不真正关心它是如何显示的。在这种情况下,shell 将被设置为处理这些事件并在应用程序范围内对它们进行操作。
我的问题是,如果一个特定的视图想要以不同的方式显示 toast 消息,你该怎么做。我喜欢全局方法,因为它非常简单,但是如何针对特殊情况进行自定义呢?
我参与了 WPF Prism 应用程序的开发,该应用程序使用事件聚合器发送全局类型消息,然后由 shell 接收。例如,一个视图模型可能希望显示一条 toast 消息,但并不真正关心它是如何显示的。在这种情况下,shell 将被设置为处理这些事件并在应用程序范围内对它们进行操作。
我的问题是,如果一个特定的视图想要以不同的方式显示 toast 消息,你该怎么做。我喜欢全局方法,因为它非常简单,但是如何针对特殊情况进行自定义呢?
为此目的使用 Eventaggregator 不是我认为的正确方式,因为事件被广播到整个应用程序。
处理这种情况的一种可能方法是您的视图模型可以在构造函数中注入 IMessenger 接口。IMessenger 有一个应用程序实现(默认注入),您可以根据需要自定义 IMessenger 的实现。您的视图模型只是调用一个接口函数(比如 DisplayMessage()),但根据注入它的 Messenger,行为是不同的。
我认为这实际上取决于您的应用程序的设置方式以及您使用的标准/模式。在 MVVM 中,我看到了两种方法。
View-First
如果您的 View-Model 被注入到您的视图中,则将消息发送到您的视图,并让视图决定如何处理它。如果它想自己显示它们,它可以做到这一点。如果它想将它们发送到您的 shell,它可以通过事件聚合器或注入 Toast 服务接口来实现。这使您的视图可以控制视觉效果。
View-Model-First
如果您的 View 被注入到您的 View-Model 中,那么您的 View Model 应该要求一个不同的 View,该 View 应该绑定到它自己的 View Model。如果它想向另一个视图模型发送消息,它可以通过事件聚合器或注入 Toast 视图模型/服务接口来实现。这使您的 View-Model 可以控制视图之间的导航。
我更喜欢 View-First 方法,因为它可以让您的 View 控制模型的可视化。但我对其他 MVVM 开发人员如何解决这个问题非常感兴趣。这似乎与如何在 MVVM View-First 方法中呈现对话框的问题非常一致。