Привязка данных (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; }
}
Это эффективно только в случаях, когда вы ничего не делаете в механизме получения, кроме как возврат значения, и когда вы ничего не делаете в механизме установки, кроме как установку значения. В нашем случае установщик делает несколько действий: он проверяет всех на регистрацию в событии, и если найдет регистрацию, то он вызывает зарегистрированный метод посредством делегата события.