2012-06-20 26 views
0

我参与了WPF Prism应用程序的开发,该应用程序使用事件聚合器发送全局类型消息,然后由外壳拾取该消息。例如,视图模型可能需要显示吐司消息,但并不真正在意它如何显示。在这种情况下,shell将被设置为处理这些事件并在应用程序范围内对其执行操作。用于条件操作的事件聚合器

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

回答

1

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

查看,首先
如果您的视图模型被注入到你的观点,然后将消息发送到您的视图,并让观决定用它做什么。如果它想要自己展示它,它可以做到这一点。如果它想将它们发送到shell,它可以通过事件聚合器或注入Toast服务接口来完成。这使您的视图控制视觉。

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

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

1

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

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