Привязка данных (Data Binding) в Silverlight - Бизнес объект и INotifyPropertyChanged

ОГЛАВЛЕНИЕ

Бизнес объект и INotifyPropertyChanged

Создайте новое приложение Silverlight, которое создаст Page.xaml и Page.xaml.cs.

Добавьте к приложению файл Book.cs, который будет представлять собой бизнес уровень.

Бизнес-объект Silverlight и тот объект, который был создан (т.е., ASP.NET) , отличаются тем, что нам необходимо заставить наш бизнес-объект учавствовать в односторонней и двусторонней привязке с уровнем пользовательского интерфейса.

Чтобы оповещать наш элемент управления о том, что бизнес-объект был изменен, бизнес-объект должен реализовывать интерфейс INotifyPropertyChanged.

Данный интерфейс требует только одного: чтобы класс имел событие типа PropertyChangedEventHandler (называнный PropertyChanged по конвенции), подразумевающий (Implicit) поддержку привязки, тем не менее, ваш бизнес-объект, согласно конвенции, должен вызывать событие PropertyChanged когда любое свойство, привязанное к элементу управления пользовательским интерфейсом будет изменено (и самым простым способом изменить его является установка его значения).

Давайте начнем с упрощенной версии класса Book:

public class Book : INotifyPropertyChanged
{
     private string bookTitle;
     public event PropertyChangedEventHandler PropertyChanged;

     public string Title
     {
       get
       {
         return bookTitle;
       }
       set
       {
         bookTitle = value;
         if (PropertyChanged != null)
         {
           PropertyChanged(this, new PropertyChangedEventArgs("Title"));
         }
       }
     }
}

Первое на что вы должны обратить внимание, так это использование выражения для System.ComponentModel, которое необходимо для интерфейса INotifyPropertyChanged. Класс декларирует то, что он выполнит данный интерфейс в объявлении класса,

public class Book : INotifyPropertyChanged

От него требуется иметь в наличии экземпляр события типа PropertyChangedEventHandler, которое согласно шаблону должно быть названо PropertyChanged. В дапнном упрощенном примере класса Book мы имеем только одно поле указанное в качестве свойства заголовка (Title) - это bookTitle. Мы не можем использовать новый упрощенный синтаксис свойства из C# 3.0 :

public class Book : INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;
   public string Title { get; set; }
}       

Это эффективно только в случаях, когда вы ничего не делаете в механизме получения, кроме как возврат значения, и когда вы ничего не делаете в механизме установки, кроме как установку значения. В нашем случае установщик делает несколько действий: он проверяет всех на регистрацию в событии, и если найдет регистрацию, то он вызывает зарегистрированный метод посредством делегата события.