从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