MVVM异常处理

9
我有一个WPF应用程序,一直在尝试以MVVM风格编写。如果抛出异常(比如打开文档时),我希望显示一个MessageBox。虽然很容易实现,但我的代码感觉不太对,因为MessageBox.Show调用在ModelView中。我认为这种事情应该放在View中,但我不应该在View中放置代码。
因此,问题实际上可以归结为在MVVM中显示MessageBox的建议方式是什么?
3个回答

17

使用服务:

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

您现在已将虚拟机从消息呈现中解耦。您甚至可以决定不再使用标准(丑陋的)消息框,而这不会影响您的虚拟机。


1
此外,使用依赖注入将IMessageService注入到需要的VM中也是使用ServiceLocator的替代方案。 - Reed Copsey
由于与表示层解耦,您可以对ViewModel进行单元测试。 - jbe
ServiceLocator 定义在哪里?这个名称无法解析,VS 和 MSDN 中的提示都没有给我任何线索。 - Stewart

9
请看Josh Smith在Codeplex上发布的优秀MVVM Foundation。特别是Messenger类,它是一种轻量级的方式,在各种ViewModel对象之间传递消息,而它们不需要知道彼此。
另外,我不认为“视图中没有代码”是一个硬性规定,尽管最好避免……记住,你的XAML只是用声明性语法编写的.NET代码;如果绝对必要,代码后台只是C#或VB.net的补充。

对于忽略“视图中无代码”的规则的部分点赞。这只是一个指导方针而已。 :) - Cameron MacFarland

2
您可能还希望在您的ViewModel类上添加一个ErrorMessage字符串属性,以便您的View可以绑定它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接