Механизм привязки данных (DataBinding), страница 8

¨  Колонка colDegree отличается по типу от остальных, так как в ней отображаются переменные типа bool.

¨  Значения свойств DataPropertyName колонок обязаны совпадать с именами свойств отображаемого класса, а значения свойств HeaderText могут отличаться.

Привязка к данным списка (BindingList<T>)

В .Net Framework 2.0 появился новый generic-класс BindingList<T>, который разработан специально для поддержки двухстороннего механизма привязки данных. Стандарт его функциональности определен интерфейсом IBindingList. Это емкий интерфейс, определяющий особенности взаимодействия по типу транзакций (commit или rollback). Отмеченные особенности реализуются с помощью методов EndNew и CancelNew. Другим, более простым вариантом реализации интерфейса IBindingList является использование класса BindingSource, что мы и будем часто делать в дальнейшем.

Создайте новую форму с именем FormGridBindList, ассоциируйте ее с гиперссылкой linkGridBindList главного окна приложения и вставьте в нее элементы, как показано на рисунке: DataGridView с именем gridMen, три метки (Label с именами lblManID, lblManName и lblManAge), три окна редактирования TextBox (с именами tManID, tManName и tManAge), флажок CheckBox с именем chkDegree и список ListBox с именем listBox.

Как и в предыдущем случае, создайте метод BindToList, вызовите его при загрузке формы. В теле этого метода мы создадим generic-список в памяти.

BindingList<Man> list = new BindingList<Man> ();

list.Add (new Man (0, "Mr. Zero Ill", 30, true));

list.Add (new Man (1, "Mrs. One Hill", 19, false));

list.Add (new Man (2, "Dr. Two Bills", 60, true));

list.Add (new Man (3, "MP. Tree Evils", 50, true));

Этот список настроен на хранение и обработку объектов конкретного типа данных (Man), поэтому он будет работать быстрее и эффективней, чем обобщенная коллекция объектов произвольного типа ArrayList. Сейчас вы самостоятельно привяжете элементы управления к полям данных списка.

¨  Привяжите DataGridView с именем gridMan к списку list                                 — Complex DataBinding

¨  Привяжите ListBox с именем listBox к списку list                                            — Complex DataBinding

¨  Привяжите TextBox с именем tManID к полю ID элемента списка list    — Simple DataBinding

¨  Привяжите TextBox с именем tManName к полю Name                          — Simple DataBinding

¨  Привяжите TextBox с именем tManAge к полю Age                                — Simple DataBinding

¨  Установите различные режимы отслеживания данных — DataSourceUpdateMode.

¨  Сравните поведение механизма связывания при установке режима, действующего по умолчанию (OnValidation) с режимом мгновенной реакции (OnPropertyChanged). Последний надо указать явно.

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

Как ускорить реакцию на изменение свойств

Для того, чтобы добиться быстрой реакции на изменение свойств текущего элемента списка, построенного по шаблону BindingList, надо чтобы объекты класса настройки шаблона (в нашем случае, класса Man) умели уведомлять (notify) своих клиентов об изменении своих свойств. Одним из способов добиться этого является реализация интерфейса INotifyPropertyChanged. Рассмотрим, как добавить эту функциональность в класс Man.

¨  Измените декларацию класса.

public class Man : INotifyPropertyChanged

Интерфейс INotifyPropertyChanged заявляет всего одно событие PropertyChanged, делегатный тип которого должен быть PropertyChangedEventHandler.

¨  Вставьте внутрь класса Man объявление события такого типа.

public event PropertyChangedEventHandler PropertyChanged;