Если вы запустите приложение прямо сейчас, то увидите, что каждая отдельная запись отображается как измененная, хотя пока ничего не изменялось! Дело в том, что во время создания объекта устанавливаются значения свойств, а установка любых значений приводит к вызову метода OnPropertyChanged
, который и устанавливает свойство IsChanged
объекта. Чтобы устранить проблему, установите свойство IsChanged
в false
последним в коде инициализации объекта. Откройте файл MainWindow.xaml.cs
и модифицируйте код создания списка:
_cars.Add(
new Car {Id = 1, Color = "Blue", Make = "Chevy",
PetName = "Kit", IsChanged = false});
_cars.Add(
new Car {Id = 2, Color = "Red", Make = "Ford",
PetName = "Red Rider", IsChanged =
false});
Снова запустите приложение, выберите автомобиль и щелкните на кнопке Change Color. Флажок Is Changed (Изменено) становится отмеченным наряду с изменением цвета.
Обновление источника через взаимодействие с пользовательским интерфейсом
Во время выполнения приложения можно заметить, что при вводе в текстовых полях флажок Is Changed не становится отмеченным до тех пор, пока фокус не покинет элемент управления, где производился ввод. Причина кроется в свойстве UpdateSourceTrigger
привязок элементов TextBox
.
Свойство UpdateSourceTrigger
определяет, какое событие (изменение значения, переход фокуса и т.д.) является основанием для обновления пользовательским интерфейсом лежащих в основе данных. Перечисление UpdateSourceTrigger
принимает значения, описанные в табл. 28.1.
Стандартным событием обновления для элементов управления TextBox
является LostFocus
. Измените его на PropertyChanged
, модифицировав привязку для элемента TextBox
, который отвечает за ввод цвета:
Если вы запустите приложение и начнете ввод в текстовом поле Color (Цвет), то флажок Is Changed немедленно отметится. Может возникнуть вопрос о том, почему для элементов управления TextBox
в качестве стандартного выбрано значение LostFocus
. Дело в том, что проверка достоверности (рассматриваемая вскоре) для модели запускается в сочетании с UpdateSourceTrigger
. В случае TextBox
это может потенциально вызывать ошибки, которые будут постоянно возникать до тех пор, пока пользователь не введет корректное значение. Например, если правила проверки достоверности не разрешают вводить в элементе TextBox
менее пяти символов, тогда сообщение об ошибке будет отображаться при каждом нажатии клавиши, пока пользователь не введет пять или более символов. В таких случаях с обновлением источника лучше подождать до момента, когда пользователь переместит фокус из элемента TextBox
(завершив изменение текста).
Итоговые сведения об уведомлениях и наблюдаемых моделях
Применение интерфейсов INotifyPropertyChanged
в моделях и классов ObservableCollection
для списков улучшает пользовательский интерфейс приложения за счет поддержания его в синхронизированном состоянии с данными. В то время как ни один из интерфейсов не является сложным, они требуют обновлений кода. К счастью, в инфраструктуре предусмотрен класс ObservableCollection
, поддерживающий все необходимое для создания наблюдаемых коллекций. Также удачей следует считать обновление проекта Fody с целью автоматического добавления функциональности INotifyPropertyChanged
. При наличии под рукой упомянутых двух инструментов нет никаких причин отказываться от реализации наблюдаемых моделей в своих приложениях WPF.
Проверка достоверности WPF
Теперь, когда интерфейс INotifyPropertyChanged
реализован и задействован класс ObservableCollection
, самое время заняться добавлением в приложение средств проверки достоверности. Приложениям необходимо проверять пользовательский ввод и обеспечивать обратную связь с пользователем, если введенные им данные оказываются некорректными. В настоящем разделе будут раскрыты наиболее распространенные механизмы проверки достоверности для современных приложений WPF, но это лишь часть возможностей, встроенных в инфраструктуру WPF.
Проверка достоверности происходит, когда привязка данных пытается обновить источник данных. В дополнение к встроенным проверкам, таким как исключения в блоках set
для свойств, можно создавать специальные правила проверки достоверности. Если Validation
, который обсуждается позже в главе.
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT