Читайте также: |
|
Связывание – это просто способ синхронизации двух элементов данных. Элемент данных (data point) – абстрактное понятие, выражающее идею «точки» в пространстве данных. Описать элемент данных можно разными способами; чаще всего он представляется источником данных и запросом. Например, элемент данных «свойство» состоит из объекта и имени свойства. Имя свойства определяет само свойство, а объект служит источником данных для этого свойства.
В WPF элемент данных представлен классом Binding. Для конструирования привязки мы указываем источник (данных) и путь (запрос). В следующем примере создается элемент данных, ссылающийся на свойство Text объекта TextBox:
Binding bind = new Binding();
bind.Source = textBox1;
bind.Path = new PropertyPath(“Text”);
Нужен еще второй элемент данных, который будет синхронизован с первым. Поскольку связывание в WPF ограничивается только деревом элементов, то для определения какого-либо элемента данных нужно вызвать метод SetBinding. Этот метод вызывается для источника данных, а данные привязываются к запросу (в данном примере к свойству ContentControl.ContentProperty):
contentControl1.SetBinding(ContentControl.Content, bind);
В этом примере свойство Text объекта textBox1 связывается со свойством Content объекта contentControl1. То же самое можно было бы выразить на XAML
<Window... Title=’ExampleBind’>
<StackPanel>
<TextBox x:Name=’textBox1’ />
<ContentControl
Margin=’5’ x:Name=’contentControl1’
Content=’{ Binding ElementName=textBox1,Path=Text }’ />
</StackPanel>
</Window>
Когда привязка объявляется в разметке, для задания источника можно использовать свойство ElementName.
Как мы только что увидели, механизм связывания можно применить для привязки свойства Text (строкового) элемента TextBox к свойству Content (имеющему тип object). Так же можно привязать свойство Text к свойству FontFamily:
<Window... Title=’ExampleBind2’ >
<StackPanel>
<TextBox x:Name=’textBox1’ />
<TextBox x:Name=’textBox2’ />
<ContentControl
Margin=’5’
Content=’{Binding ElementName=textBox1,Path=Text}’
FontFamily=’{Binding ElementName=textBox2,Path=Text}’ />
</StackPanel>
</Window>
Существует два механизма преобразования: класс TypeConverter, существующий в.NET, начиная с версии 1.0, и новый интерфейс IValueConverter. В нашем случае с классом FontFamily ассоциирован конвертер типов TypeConverter, поэтому преобразование выполняется автоматически.
Чтобы выполнить нужное преобразование, можно воспользоваться конвертерами значений, ассоциированными с привязкой. Для этого берется источник (строка из свойства Text) и преобразуется в какой-то объект, который понимает получатель (свойство Content).
Начнем с создания простого типа:
public class Human
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
Тип мог бы быть любым: встроенным, библиотечным, разработанным вами. Идея в том, что мы хотим преобразовать свойство Text в объект конкретного типа. Для этого произведем конвертер от интерфейса IValueConverter и реализуем два метода:
public class HumanConverter: IValueConverter
{
public object Convert(
object value, Type targetType, object parameter, CultureInfo culture)
{
Human h = new Human();
h.Name = (string)value;
return h;
}
public object ConvertBack(
object value, Type targetType, object parameter, CultureInfo culture)
{
return ((Human)value).Name;
}
}
В более сложных случаях реализовать преобразование в обе стороны может оказаться невозможно. Последний шаг при использовании конвертера – ассоциировать его с привязкой:
<ContentControl
Margin=’5’
FontFamily=’{Binding ElementName=textBox2,Path=Text}’>
<ContentControl.Content>
<Binding ElementName=’textBox1’ Path=’Text’>
<Binding.Converter>
<l:HumanConverter xmlns:l=’clr_namespace:ExampleBind’/>
</Binding.Converter>
</Binding>
</ContentControl.Content>
</ContentControl>
Элементы данных и преобразования – две базовые конструкции механизма связывания. Познакомившись с основными ингредиентами данных, мы можем заняться деталями привязки к объектам CLR.
Дата добавления: 2015-08-13; просмотров: 96 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Ресурсы | | | Привязка к объектам CLR |