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