Главная » Разработка для Windows Phone 7 » Механизмы уведомления Windows Phone 7

0

Чтобы привязки данных работали, источник данных должен реализовывать некоторый механизм уведомления. Этот механизм уведомления сигнализирует об изменении значения свойства, сообщая о том, что новое значение может быть извлечено из источника и передано в цель. При связывании свойства Value объекта Slider и свойства Text объекта TextBlock мы имеем дело с двумя свойствами-зависимостями. Этого нельзя заметить в открытых программных интерфейсах, но свойства-зависимости обеспечивают именно такой механизм уведомления.

Безусловно, соединять два визуальных элемента с помощью привязки данных удобно, но в большинстве случаев целевым объектом привязки данных является визуальный элемент, а вот источник нет. Чаще всего это сущность, которую принято называть бизнес-объектом.

И теперь внимание!

Иногда, когда разработчики знакомятся с новой и важной возможностью операционной системы – такой как свойства-зависимости, которые обсуждались в предыдущей главе – им хочется применить эту возможность везде, вероятно, просто чтобы опробовать ее и поупражняться. Но со свойствами-зависимостями это не очень хорошая идея. Несомненно, свойства-зависимости должны использоваться при наследовании от классов, производных от DependencyObject, но, вероятно, не следует наследоваться от DependencyObject исключительно для того, чтобы применить свойства-зависимости.

Иначе говоря, не бросайтесь переписывать свои бизнес-объекты ради использования свойств-зависимостей в них!

Целями привязок данных должны быть свойства-зависимости, но к источникам привязок это требование не предъявляется. Источниками привязок могут быть старые добрые свойства старых добрых классов. Но источник должен реализовывать некоторый механизм уведомления об изменении собственного значения, чтобы обеспечить обновление значения цели.

Практически всегда в бизнес-объектах, выступающих в роли источников привязок, механизм уведомления реализовывается через интерфейс INotifyPropertyChanged (Уведомление об изменении свойства). INotifyPropertyChanged описан в пространстве имен System.ComponentModel (Компонентная модель). Это явный признак того, что данный интерфейс не ограничен лишь рамками Silverlight и играет очень важную роль в .NET. Он является средством, с помощью которого бизнес-объекты уведомляют об изменении своих данных.

При этом INotifyPropertyChanged исключительно прост. Он описывается следующим образом:

public interface INotifyPropertyChanged {

event PropertyChangedEventHandler PropertyChanged:

}

Класс может реализовать INotifyPropertyChanged, просто описав открытое событие PropertyChanged (Значение свойства изменилось). В сущности, это событие классу абсолютно ни к чему, но правила приличия требуют, чтобы класс формировал это событие при каждом изменении значения одного из его свойств.

Делегат PropertyChangedEventHandler (Обработчик события изменения значения свойства) ассоциирован с классом PropertyChangedEventArgs (Аргументы события изменения значения свойства), у которого имеется одно единственное открытое свойство только для чтения PropertyName типа string. Имя свойства, значение которого изменилось, передается в конструктор PropertyChangedEventArgs.

Иногда в классе, реализующем INotifyPropertyChanged, можно увидеть защищенный виртуальный метод OnPropertyChanged (При изменении значения свойства) с аргументом типа PropertyChangedEventArgs. Применение данного метода не является обязательным, но удобно для производных классов. Этот метод является замечательным местом для формирования события изменения значения свойства, и я использую его в своих примерах.

Бизнес-объекты, которые реализуют INotifyPropertyChanged, не наследуются от FrameworkElement, т.е. они не являются частью дерева визуальных элементов XAML-файла. Обычно их экземпляры создаются как XAML-ресурсы или в файле выделенного кода.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии