Если вы запустите приложение прямо сейчас, то увидите, что каждая отдельная запись отображается как измененная, хотя пока ничего не изменялось! Дело в том, что во время создания объекта устанавливаются значения свойств, а установка любых значений приводит к вызову метода 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