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

lblNum.DataBindings.Add ("Text", comboCultures, "SelectedIndex");

Запустите программу и убедитесь, что мы включили как Complex DataBinding, заполнив список данными, полученными из недр самой системы, так и Simple DataBinding, заставив метку следить за выбранным элементом списка.

Форматирование данных, возвращаемых связью

Параметры связывания заданы при вызове метода Add коллекции связей ControlBindingsCollection, доступ к которой обеспечивает свойство DataBindings. При этом неявно создается объект класса Binding, который затем помещается в коллекцию DataBindings. Если перед тем, как задать параметры связи (см. вызов метода Add), создать явный объект класса Binding, и правльно настроить его, то он сможет на ходу, динамически (в обработчике события Format) форматировать возвращаемые им данные и показывать связанные данные в таком виде, в котором нам будет удобно их наблюдать. Добавьте такой фрагмент.

Binding b = new Binding ("Text", comboCultures, "SelectedValue");

b.Format += delegate (object tb, ConvertEventArgs ce)

{

CultureInfo info = CultureInfo.GetCultureInfo ((int) ce.Value);

ce.Value = info.IetfLanguageTag;

};

tCulture.DataBindings.Add (b);

Запустите проект на выполнение и убедитесь, что в текстовом окне tCulture отбражается свойство IetfLanguageTag, имееющееся в классе CultureInfo. Смысл этого свойства (Tags for the Identification of Languages) описан в международном стандарте RFC 3066, за которым следит организация Internet Engineering Task Force (IETF). Погружение в стандарты — это скучное занятие, поэтому перейдем к следующему свойству класса CultureInfo.

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

Сначала сформулируем сигнатуру метода: void SetBinding (object control, string propName). Новый метод должен установить желаемые нами параметры объекта Binding и включить механизм привязки данных с учетом форматирования. Добавьте его в класс формы.

private void SetBinding (object control, string propName)

{

Binding b = new Binding ("Text", comboCultures, "SelectedValue");

b.Format += delegate (object sender, ConvertEventArgs e)

{

CultureInfo info = CultureInfo.GetCultureInfo ((int) e.Value);

e.Value = GetPropValue (info, propName);

};

((Control)control).DataBindings.Add (b);

}

Все хорошо, но осталось создать метод GetPropValue, то есть, догадаться, как получить значение свойства, зная лишь его имя. Здесь нас выручает всемогущий механизм рефлексии, который делает платформу .NET столь захватывающим инструментом исследования ее (и наших) возможностей. Класс PropertyInfo позволяет для любого объекта получить текущее значение любого его свойства и это великолепно! Так как нам понадобилась рефлексия, добавьте директиву using System.Reflection; и новый метод GetPropValue.

private object GetPropValue (CultureInfo info, string propName)

{

foreach (PropertyInfo p in typeof(CultureInfo).GetProperties())

{

if (p.Name == propName)

return p.GetValue (info, BindingFlags.GetProperty, null, null, info);

}

return null;

}

Теперь замените весь фрагмент, рассмотренный в начале этого параграфа, на вызов метода:

SetBinding (tCulture, "IetfLanguageTag");

и убедитесь, что функциональность приложения не утеряна.

Добавьте на форму еще несколько пар элементов Label-TextBox, вызывайте метод SetBinding, передавая ему ссылки на окна типа TextBox и имена свойств, которые вы хотите просмотреть с помощью механизма отслеживания данных (Simple DataBinding). Пусть механизм привязки отображает разные свойства класса CultureInfo. Например так, как показано на рисунке.

Привязка коллекции строк ComboBox