Обработка исключений MVVM

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

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


person Jake Pearson    schedule 26.08.2009    source источник


Ответы (3)


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

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

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

person Kent Boogaart    schedule 26.08.2009
comment
+1: Кроме того, альтернативой использованию ServiceLocator может быть использование Dependency Injection для внедрения IMessageService в виртуальные машины по мере необходимости. - person Reed Copsey; 26.08.2009
comment
Из-за отделения от уровня представления вы можете выполнять модульное тестирование своей ViewModel. - person jbe; 29.08.2009

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

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

person kiwipom    schedule 27.08.2009
comment
+1 за немного об игнорировании правила отсутствия кода в представлении. В любом случае это скорее ориентир. :) - person Cameron MacFarland; 27.08.2009

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

person Wayne Bloss    schedule 09.10.2010