9

在 Pluralsight 上观看有关 MVVM 的视频时,出现了一种违反 MVVM 模式但没有显示正确方法的情况:

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

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

4

2 回答 2

12

创建服务:

interface IDialogService
{
    void ShowMessageBox(string message);
}

实现它:

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

使用依赖注入:

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>();
    }
}

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

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

于 2013-06-01T22:06:09.447 回答
5

有几种方法可以遵循 MVVM 模式,例如Interaction ServiceInteraction Request

交互服务

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

在此处输入图像描述

交互请求

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

在此处输入图像描述

资源

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

于 2013-06-01T22:08:47.093 回答