我是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模式,如果没有,我该怎么做才能解决它?
答案 0 :(得分:2)
我会创建一个实现IDialogService的DialogService类。此类/接口应包含您认为适合所需对话的任何方法。
我也会使用像Unity这样的依赖注入器,所以在我的单元测试中我可以模拟IDialogService而不是弹出MessageBox窗口。另一种方法是将实际的UI代码放在受保护的虚拟方法中,让单元测试使用替换MessageBox调用的IDialogService。
所以在你的情况下,我只会调用IDialogService.DisplayError(Exception ex)之类的东西。
答案 1 :(得分:2)
您的示例是正确使用MVVM模式,因为您有一个单独的ViewModel,我假设您绑定到该模式并且不了解View。
可能你可以通过用Exception属性替换ShowMessage函数(实际上不显示我猜的消息)来简化ViewModel并设置它。
您没有使用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;
}