Обработка исключений с MVVM в модели - PullRequest
0 голосов
/ 29 октября 2018

Как новичок в WPF и теории MVVM, Какова лучшая практика для обработки исключений в модели, которые должны вызывать визуальное оповещение в представлении?

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

Модель представления инструктирует модель записывать некоторые данные в файл, вызывая соответствующий метод в модели. Если запись не удалась по какой-либо причине, модель выдает исключение.

Это исключение должно активировать представление для отображения скрытой сетки и заполнения текстового блока сообщения об ошибке.

Каков наилучший способ достичь этого?

Мои мысли таковы: в моей модели мне нужно создать логическое свойство «ExceptionThrown» и строковое свойство «ErrorMessage». Модель должна будет использовать интерфейс INotifyPropertyChanged, и мне нужно каким-то образом привязать мою скрытую сетку ошибок к свойству «ExceptionThrown». Таким образом, при изменении свойства «ExceptionThrown» привязки «PropertyChangedEventHandler» и представления будут отображать скрытую сетку и сообщение об ошибке.

Этот подход кажется неправильным, слишком сложным и ограничивающим. Что я действительно хочу сделать, это заполнить сообщение об ошибке и видимость скрытой сетки в viewmodel, когда исключение выдается в модели.

Я потратил несколько часов на поиски наилучшего способа приблизиться к этому, но я не нашел ничего окончательного; Я очень уверен, что на это где-то подробно ответили, я просто не нашел его.

Просто ищу хороший совет.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

На самом деле вам не нужны исключения для обработки данных. Лучшее решение для приложений WPF / MVVM - использовать IDataErrorInfo.

1) Реализуйте IDataErrorInfo либо в вашей модели, либо в ViewModel - в зависимости от того, к чему вы фактически привязываетесь.

public class PersonModel: IDataErrorInfo
{
    public string Name { get; set; }

    public string this[string columnName]
    { 
        get 
        {
            var result = string.Empty;

            switch (columnName)
            {
                case nameof(Name):
                    if (string.IsNullOrWhiteSpace(Name))
                        result = "Name is required";
                    break;
            }
        }
    }
}

2) Обновите привязку данных, чтобы установить ValidatesOnDataErrors.

<TextBox Text="{Binding Model.Name, 
                ValidatesOnDataErrors=True, 
                UpdateSourceTrigger=PropertyChanged}" />

По умолчанию это дает вам красную рамку вокруг элемента управления, когда он находится в состоянии ошибки.

Чтобы получить фактическое отображаемое сообщение об ошибке, необходимо обновить Validation.ErrorTemplateProperty для элемента управления - текст ошибки можно найти, связавшись с (Validation.Errors)[0].ErrorContent.

Я рассмотрел это, включая общий способ обработки отображения проверки (вместо написания нового стиля для каждого используемого вами типа элемента управления), в недавнем блоге .

0 голосов
/ 30 октября 2018

Я бы отделил всю логику отображения ошибок от своих собственных ViewModel и View (UserControl или что-то в этом роде) и отправил бы им ошибки с сообщениями.

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

Здесь - это реализация мессенджера, которую вы можете использовать для достижения этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...