Страницы

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

вторник, 12 февраля 2019 г.

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

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

необходимо при нажатии на ОК вывести информацию о всех ошибках, которые допустил пользователь.
интересует следующее (да, я знаю что 1 вопрос - 1 тема):
производить валидацию в модели или в представлении? если в модели - то каким образом выводить информацию об ошибках? можно ли в модели использовать MessageBox? если в представлении - не нарушает ли это логику паттерна? когда нужно использовать IDataErrorInfo и валидацию, а когда обойтись get;set;
UPD проект ссылка на github
колхоз находится в 2 файлах:
1) тут я не придумал ничего лучше чем впихнуть проверку данных в самой модели
2) в этом представлении у меня так же через цензуру происходит вывод сообщения об ошибке
Как вариант исправления всего этого я вижу 1 способ: для StudentWindow создать отдельную модель, но чет я представить не могу что в ней писать.


Ответ

В модели представления (она же 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. (Он позволяет асинхронную валидацию, а также кросс-валидацию: ошибка может быть не в значении одного свойства, а в недопустимой комбинации значений нескольких свойств!)

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

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