2009-08-26 56 views
9

我有一个WPF应用程序,我一直试图用MVVM风格编写。如果引发异常(如打开文档时),我想显示一个MessageBox。容易做到,但我的代码感觉不太好,因为MessageBox.Show调用在ModelView中。我认为这种事情应该生活在视图中,但我不应该把代码放在视图中。MVVM异常处理

所以这个问题真的可以被提取到什么是在MVVM中显示MessageBox的建议方式?

回答

16

使用的服务:

public void SomeMethodInYourViewModel() 
{ 
    try 
    { 
     DoSomethingDangerous(); 
    } 
    catch (Exception ex) 
    { 
     ServiceLocator.Resolve<IMessageService>().ShowMessage(ex.Message); 
    } 
} 

您现在已经从消息的呈现分离的虚拟机。你甚至可以决定不使用标准(丑陋)的消息框,这不会影响你的虚拟机。

+1

+1:此外,使用ServiceLocator的替代方法是使用依赖注入将IMessageService根据需要插入到VM中。 – 2009-08-26 18:43:39

+0

由于从表示层解耦,您可以单元测试您的ViewModel。 – jbe 2009-08-29 09:55:30

9

看看Josh Smith的优秀MVVM基金会Codeplex。具体来说,查看一下Messenger类,这是一种在不需要彼此识别的各种ViewModel对象之间传递消息的轻量级方法。

此外,我不相信在“视图中没有代码”方面有一条硬性规定,尽管如果可能的话最好避免......请记住,您的XAML是简单的.net代码写入在声明性语法中;代码隐藏只是C#或VB.net来补充(如果绝对必要!)

+0

+1关于忽略“无法查看代码”规则的位。无论如何,这更像是一条指引。 :) – 2009-08-27 05:20:56

2

您可能还想在视图可以绑定到的ViewModel类上放一个ErrorMessage字符串属性。