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

Теперь рассмотрим, как работает механизм сложной привязки данных (Complex DataBinding). Этот механизм позволяет привязать много ко многому, например: массив к коллекции или коллекцию к коллекции. Сейчас мы привяжем массив ссылок на объекты класса CultureInfo к коллекции объектов (ObjectCollection), которая имеется внутри каждого выпадающего списка (элемента типа ComboBox). Это позволит наполнить список строками текста с перечнем всех культур, установленных в вашей версии .NET Framework.

Для того, чтобы не затемнять сущность уже исследованного примера, добавьте к проекту новую форму с именем FormComboArray, а в форму главного окна добавьте три ссылки LinkLabel с именами linkComboArray, linkComboTable, linkGridList, linkGridBindListи linkGridTable, как показано на рисунке.

Установите свойство LinkData для первой ссылки так, чтобы она помнила ссылку (по сути, адрес) той формы FormComboArray, в рамках которой мы будем демонстрировать механизм сложного связывания данных. Для этого добавьте такой код (LinkData — это объект):

linkComboArray.Links[0].LinkData = new FormComboArray ();

Для гиперссылки linkComboArray добавьте (в класс главной формы) обработчик события LinkClicked. Переименуйте метод, так как он будет общим для всех гиперссылок.

private void link_Clicked (object sender, LinkLabelLinkClickedEventArgs e)

{

(e.Link.LinkData as Form).Show ();

}

В теле этого метода мы просто открываем уже существующую форму. Чтобы быть последовательными, добавим обработчик события FormClosing и отменим уничтожение объекта. Теперь форма не умирает, а просто прячется.

private void FormComboArray_FormClosing (object sender, FormClosingEventArgs e)

{

e.Cancel = true;   Hide();

}

Отметьте, что все следующие формы должны вести себя таким же образом и самостоятельно реализуйте эту функциональность. Переведите форму FormComboArray в режим дизайна  Добавьте в нее новые элементы (как показано на рисунке): ComboBox с именем comboCultures, две метки Label (их текст см. на рисунке, а имена произвольны), одну метку с именем lblNum и TextBox с именем tCulture.

Новый рисунок

Для новой формы создайте обработчик события Load. Всего три строки кода (которые вы вставите внутрь метода FormComboArray_Load) реализуют Complex DataBinding.

comboCultures.DataSource = CultureInfo.GetCultures(CultureTypes.FrameworkCultures);

comboCultures.ValueMember = "LCID";

comboCultures.SelectedValue = CultureInfo.CurrentCulture.LCID;

Источником данных для коллекции Items списка comboCultures (она имеет тип ObjectCollection) служит массив ссылок на объекты класса CultureInfo. Этот массив получен путем вызова статического метода GetCultures, который имеется в том же классе CultureInfo, поддерживающем установленные в системе культуры. Смысл параметра вы без труда поймете, прочтя подсказку IntelliSense. Свойство ValueMember определяет, что же именно из объекта CultureInfo будет высвечено в списке (и выбрано, когда пользователь воспользуется выпадающим списком). Мы указали, что из всех богатств класса культуры мы хотим показать только одно свойство LCID (идентификатор местности — locale). Вы можете уточнить тип связывания по сценарию: покажи (Display) одно, а выбери (Value) другое. Для этого надо установить свойство DisplayMember, например:

comboCultures.DisplayMember = "EnglishName";

Но пока такой сценарий нам не нужен. Третья строка фрагмента (установка свойства SelectedValue) способна запустить механизм простого связывания, который мы вскоре добавим и настроим. Она производит некое действие, аналогичное тому, что делает пользователь при выборе строки в списке.

Так как мы в России (и CurrentCulture не изменяли), то присвоение значения свойству SelectedValue выберет в списке строку, соответствующую нашей культуре (1049, или "ru-RU"). Вскоре мы покажем, как идентификатор 1049 преобразовать в текст "ru-RU", а сейчас заставим метку lblNum отобразить (и все время отслеживать) индекс текущего элемента списка. Такой тип связывания вы уже осуществляли и должны уметь делать его самостоятельно.