2014-12-13 3 views
3

Я довольно новичок в WPF, и мне нужно реализовать настраиваемое окно сообщений после шаблона MVVM, но без использования каких-либо вспомогательных библиотек MVVM. Это поле сообщения будет использоваться для предоставления информации о непредвиденных ошибках, возникающих в приложении, - общем сообщении + стеке в деталях. Я обрабатываю событие DispatcherUnhandledException для этого, и я использую это настраиваемое окно сообщений в обработчике этого события.Корректная реализация пользовательского MessageBox WPF с использованием шаблона MVVM

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

Ваш пример - правильное использование шаблона MVVM, поскольку у вас есть отдельный ViewModel, к которому я предполагаю, что вы привязываетесь и который не знает о представлении.

Возможно, вы можете упростить ViewModel, заменив функцию ShowMessage (которая на самом деле не отображает сообщение, которое я предполагаю), с свойством 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; 
} 
+0

Спасибо за ваш ответ, я исправил свой код с вашими предложениями, и это упростило мою модель просмотра. Кроме того, я не знал разницы между Show и ShowDialog, но теперь я изменил Show() на ShowDialog(). –

+0

Я рассматриваю возможность завершения приложения, если возникает необработанное исключение, но я совершенно не уверен. –

+1

Прекращение приложения - хорошая идея, поскольку необработанное исключение может испортить ваши данные. До этого вы должны, по крайней мере, регистрировать детали исключения, если не просто показывать его пользователю, чтобы скопировать/вставить и отправить обратно. Проверьте ExceptionViewer на http://www.codeproject.com/Tips/469452/WPF-ExceptionViewer, как захватить внутренние детали любого исключения (код IIRC не работает в нескольких местах - исключение NullReferenceException), и вы можете в конечном итоге сделать MVVM версию такого зрителя для пользователей вашего приложения. – too

2

Я бы создал класс DialogService, который реализует IDialogService. Этот класс/интерфейс должен содержать любые методы, которые вы сочтете подходящими для необходимых вам Диалогов.

Я бы также использовал инжектор зависимостей, такой как Unity, поэтому в моих модульных тестах я могу выполнить Mock IDialogService и не всплывать окна MessageBox. Другой подход заключается в том, чтобы поместить фактический код пользовательского интерфейса в защищенные виртуальные методы и использовать в своих модульных тестах IDialogService, который заменяет вызовы MessageBox.

Так что в вашем случае я бы назвал нечто вроде IDialogService.DisplayError (Exception ex).

+0

Благодарим за отзыв! Я использую инжектор зависимости, это Unity (это то, что мне разрешено использовать), и я также использую IDialogService для случайных сообщений (для которых я использую обычный MessageBox). Возможно, неплохо было бы переместить эту небольшую логику. –

Смежные вопросы