Подтвердить что ты не робот

Где я могу уловить исключения в MVVM?

У моего класса модели модели есть метод (не уверен, что это хорошая практика, или если модели представления должны быть строго механизмами изменения свойств и свойств), которые соединяются с сервисом. Конечно, я хочу обрабатывать любые возможные исключения WCF при подключении или отключении.

Позвольте использовать конечную точку, не найденную в качестве примера, учитывая, что это исключение, которое я хотел бы обратить на внимание пользователя. Рассмотрим пример грубого кода:

public void Connect()
{
    ServiceClient proxy = null;
    try
    {
        proxy = new ServiceClient();
        proxy.Subscribe();
        // ...
    }
    catch(EndpointNotFoundException)
    {
        // should I do something here?
    }
    // .. other WCF related exception catches and a finally
}

Считается ли хорошей практикой, возможно, вызывать System.Windows.MessageBox.Show() непосредственно внутри catch или я могу, возможно, перестроить исключение, так что другой слой моего приложения WPF поймает его? Если да, то где это идеальное место, чтобы поймать такое исключение?

4b9b3361

Ответ 1

Я обрабатывал исключения в моем MVVM-клиенте, улавливая их и обертывая их в свойство ErrorViewModel любого ViewModel, поймавшего исключение.

Скажем, ViewModel A ловит исключение EndpointNotFoundException. Чтобы представить эту ошибку, я завершаю Exception в ErrorViewModel и присваиваю этому свойству свойство A.

Вид, связанный с A, содержит ContentControl, привязанный к свойству A Ошибка. Между тем, я использую DataTemplate, чтобы связать представление ошибки с ErrorViewModel. В этом представлении Visibility определяется, имеет ли свойство A Ошибка содержит исключение.

So A View содержит сообщение об ошибке "Просмотр", которое будет отображаться только при обнаружении исключения и может быть уволено пользователем (кнопка "ОК" в сообщении об ошибке "Вид" вызывает команду A, который очищает свойство A, тем самым изменяя сообщение об ошибке View visibility на Collapsed).

До сих пор это, по-видимому, хороший подход, который сохраняет правильную развязку MVVM.

Надеюсь, что это поможет. Так или иначе, честно говоря, я бы рассмотрел System.Windows.MessageBox.Show() в приложении WPF как исключительно последнее средство. Зачем отказываться от богатого контроля над пользовательским интерфейсом в пользу этой старой вещи? Говоря о том, что здесь другой подход всплывающих программ.