从ViewModel显示一个消息框违反了MVVM – 如何避免?

在Pluralsight上观看有关MVVM的video时,有一种情况是MVVM模式被违反但没有正确的方法显示:

  • 该视图有一个按钮,使用ICommand触发ViewModel中的处理程序。
  • 处理程序正确地将执行转发到存储库实现。
  • 存储库的具体实现称为Web服务方法。

但是:如果Web服务调用失败,ViewModel将弹出一个消息框,通知用户该错误。 由于ViewModel是View的抽象,它不应该直接创建UI,但是为用户提供该消息框的100%干净方法是什么?

创建服务:

interface IDialogService { void ShowMessageBox(string message); } 

实施它:

 class DialogService : IDialogService { public void ShowMessageBox(string message) { MessageBox.Show(); // ... } } 

使用dependency injection:

 class ViewModel { [Import] // This is MEF-specific sample private readonly IDialogService dialogService; } 

或服务地点:

 class ViewModel { private AnyCommandExecute() { // This is MEF-specific sample var dialogService = container.GetExportedValue(); } } 

在视图模型中获取具体的IDialogService ,然后从ViewModel调用获取的实现。

相同的方法适用于任何其他类似情况:显示打开/保存对话框,在对话框中显示自定义视图模型。

有几种方法可以遵循MVVM模式,例如交互服务交互请求

互动服务

…视图模型可以使用的服务来启动与用户的交互,从而保持其在视图实现上的独立性

在此处输入图像描述

交互请求

…使用视图模型引发的事件来表达与用户交互的意图,以及视图中绑定到这些事件并管理交互的可视方面的组件。

在此处输入图像描述

资源

上面的两个引用都来自此源(其中还包含有关模式的更多详细信息): http : //msdn.microsoft.com/en-us/library/gg405494(v = pandp.40 ) .aspx#sec10