Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

где должна производится обработка вводимых данных в паттерне MVVM?

#c_sharp #wpf #mvvm


задача:

есть такое окно добавления данных(фамилия и имя не должны быть пустыми, возраст -
число в адекватном диапазоне, обязательно должен быть выбран пол)



необходимо при нажатии на ОК вывести информацию о всех ошибках, которые допустил
пользователь.

интересует следующее (да, я знаю что 1 вопрос - 1 тема): 


производить валидацию в модели или в представлении?
если в модели - то каким образом выводить информацию об ошибках?
можно ли в модели использовать MessageBox?
если в представлении - не нарушает ли это логику паттерна?
когда нужно использовать IDataErrorInfo и валидацию, а когда обойтись get;set;


UPD
проект
ссылка на github

колхоз находится в 2 файлах:

1) тут я не придумал ничего лучше чем впихнуть проверку данных в самой модели

2) в этом представлении у меня так же через цензуру происходит вывод сообщения об ошибке

Как вариант исправления всего этого я вижу 1 способ: для StudentWindow создать отдельную
модель, но чет я представить не могу что в ней писать. 
    


Ответы

Ответ 1



В модели представления (она же VM). Валидация вводимых данных — типичная задача мелкой бизнес-логики. Есть много способов. Лучше всего, вероятно, асинхронный интерфейс INotifyDataErrorInfo. (Вот ответ по теме: https://stackoverflow.com/a/9950236/276994.) Строго говоря — нет. VM вообще не должна знать, выводятся ошибки в MessageBox, в строку состояния, Popup возле элемента с ошибкой или куда-нибудь ещё, это дело View. Правильная организация вывода ошибок — сложная тема. Умеренно простой вариант решения — здесь (сервис открытия произвольных окон). Более правильное идеологически решение было бы иметь глобальный сервис отображения ошибок, для которого View предоставляет свою имплементацию. Это довольно сложная тема, включающая в себя в общем случае решение вопросов Должны ли сообщения об ошибках автоматически исчезать через некоторое время? Как юзер может убрать сообщение об ошибке? Что если у нас одновременно несколько сообщений? Нужны ли приоритеты по важности? Что делать с повторяющимися сообщениями об ошибке (например, программа долбится в файл, защищённый от записи, и каждую секунду производит одно и то же сообщение об ошибке) и т. д. На практике, однако, (слишком) часто не заморачиваются, и пишут в VM код наподобие catch (Exception e) // ужасно { MessageBox.Show("Error!", e.Message); // ещё ужаснее } Постарайтесь так не делать, знайте, что юзерам это не понравится. Логика паттерна такова: за то, когда возникает ошибка и какова она, отвечает VM. За то, где и каким образом показывать её, отвечает View. Таким образом, логика паттерна не нарушена. Это вопрос к архитектору вашего приложения, на него нету однозначного ответа. У меня в проекте, например, валидация может занимать длительное время, поэтому я не пользуюсь ни тем и ни другим, а предпочитаю третий вариант — INotifyDataErrorInfo. (Он позволяет асинхронную валидацию, а также кросс-валидацию: ошибка может быть не в значении одного свойства, а в недопустимой комбинации значений нескольких свойств!)

Комментариев нет:

Отправить комментарий