使用MVVM模式正确实现WPF自定义MessageBox。

3

我对WPF还很陌生,但是我需要按照MVVM模式实现一个自定义消息框,而不使用任何MVVM帮助库。这个消息框将用于提供有关应用程序中发生的意外错误的信息 - 一般消息+详细信息中的堆栈跟踪。 为此,我正在处理DispatcherUnhandledException事件,并在该事件的处理程序中使用此自定义消息框。

void Current_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        CustomMessageBoxViewModel messageBox = new CustomMessageBoxViewModel();
        messageBox.ShowMessage(e.Exception.Message, e.Exception.StackTrace);
        CustomMessageBoxWindow messageBoxWindow = new CustomMessageBoxWindow();
        messageBoxWindow.DataContext = messageBox;
        messageBoxWindow.Show();

        e.Handled = true;
    }

你能告诉我这是否是正确使用MVVM模式的方式,如果不是,有什么方法可以修复吗?

2个回答

2
您的示例是正确使用MVVM模式的,因为您有一个单独的ViewModel,我假设您会将其绑定并且它不知道View的存在。
可能您可以通过替换ShowMessage函数(我猜实际上并不显示消息)来简化ViewModel,并设置Exception属性。
您没有使用ShowDialog的原因是什么?如果一些事情一直出错,您最终可能会在屏幕上看到很多异常对话框。
void Current_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
    CustomMessageBoxViewModel messageBox = new CustomMessageBoxViewModel();
    messageBox.Sender = sender;
    messageBox.Exception = e.Exception;
    CustomMessageBoxWindow messageBoxWindow = new CustomMessageBoxWindow();
    messageBoxWindow.DataContext = messageBox;
    messageBoxWindow.ShowDialog();

    e.Handled = true;
}

谢谢您的回复,我已经根据您的建议纠正了我的代码,并且它确实简化了我的视图模型。此外,我之前不知道Show和ShowDialog之间的区别,但现在我也将Show()更改为ShowDialog()。 - Alex Stefan
如果发生未处理的异常,我正在考虑终止应用程序,但我不太确定。 - Alex Stefan
1
终止应用程序是个好主意,因为未处理的异常可能会破坏您的数据。在此之前,如果不能向用户显示异常信息以供复制/粘贴并发送给您,至少应记录异常详细信息。请查看http://www.codeproject.com/Tips/469452/WPF-ExceptionViewer上的ExceptionViewer,获取任何异常的内部详细信息(IRC代码在几个地方存在漏洞-NullReferenceException),您可能需要为您的应用程序用户创建MVVM版本的这种查看器。 - too

2
我会创建一个实现IDialogService的DialogService类。这个类/接口应包含您认为适合所需对话框的任何方法。
我还将使用依赖注入器,如Unity,以便在我的单元测试中可以模拟IDialogService而不弹出MessageBox窗口。另一种方法是将实际的UI代码放在受保护的虚拟方法中,并让您的单元测试使用替换MessageBox调用的IDialogService。
因此,在您的情况下,我只需调用像IDialogService.DisplayError(Exception ex)这样的内容。

谢谢您的回复!我正在使用一个依赖注入器,它是Unity(这是我被允许使用的),我还使用了一个IDialogService来显示随机消息(我使用普通的MessageBox)。将这个小逻辑移动到那里可能是个好主意。 - Alex Stefan

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