2009-08-26 4 views
9

У меня есть приложение WPF, которое я пытался написать в стиле MVVM. Если выбрано исключение (например, когда документ открыт), я бы хотел отобразить MessageBox. Легко сделать, но мой код не совсем прав, потому что вызов MessageBox.Show находится в ModelView. Я думал, что это похоже на жизнь в представлении, но я не должен помещать код в представление.MVVM Обработка исключений

Таким образом, вопрос действительно может быть доведен до , каков предложенный способ отображения MessageBox в MVVM?

ответ

16

Используйте сервис:

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

Вы теперь развязаны ваши виртуальные машины из презентации сообщений. Вы даже можете вообще не использовать стандартные (уродливые) окна сообщений, и это не повлияет на ваши виртуальные машины.

+1

+1: Кроме того, альтернативой использованию ServiceLocator было бы использование Injection Dependency для инъекции IMessageService в виртуальные машины по мере необходимости. –

+0

Из-за развязки с уровня презентации вы можете выполнить модульный тест ViewModel. – jbe

9

Посмотрите на отличный MVVM Foundation Джоша Смита на Codeplex. В частности, посмотрите класс Messenger - легкий способ передачи сообщений между различными объектами ViewModel, которые не должны знать друг о друге.

Кроме того, я не считаю, что существует жесткое правило «Нет кода в представлении», хотя лучше всего избегать, если это возможно ... помните, что ваш XAML - это просто код .net в декларативном синтаксисе; код - это просто C# или VB.net, чтобы дополнить это (если это абсолютно необходимо!)

+0

+1 для бит об игнорировании правила «no code in view». В любом случае, это больше ориентировочно. :) –

2

Вы также можете просто поместить свойство строки ErrorMessage в свой класс ViewModel, с которым может взаимодействовать ваш View.

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