Содержание
Из предыдущей части мы узнали в общих чертах, что из себя представляет привязка в WPF. Теперь мы более подробно разберемся с тем как работает привязка в WPF, какие параметры мы можем использовать в выражениях привязки и изучим режимы привязки в WPF. Привязка данных в WPF осуществляется с использованием объектов типа Binding на свойствах которого мы сегодня и остановимся. Свойства Binding в коде XAML выступают в качестве параметров выражения и одним из важнейших свойств этого типа является свойство отвечающее за режимы привязки.
Свойства Binding
В начале рассмотрим в общих чертах свойства Binding, а, затем, изучим влияние различных значений этих свойств на привязку данных в WPF более подробно. Тип Binding предоставляет нам достаточно много различных свойств, однако, среди них можно выделить ряд свойств, которые используются в приложениях наиболее часто:
| Свойство | Тип | Описание |
Converter |
IValueConverter |
Получает или задает используемый конвертер значений. О конвертерах значений будет отдельная часть. |
Converter |
CultureInfo |
Получает или задает язык и региональные параметры для конвертера значений |
Converter |
object |
Необязательный параметр для конвертера значений |
ElementName |
string | Имя объекта-источника привязки |
Mode |
BindingMode |
Режим привязки. Может принимать одно из следующих значений:
|
Path |
PropertyPath |
Путь к свойству источника привязки |
Source |
object |
Объект-источник привязки |
RelativeSource |
RelativeSource |
Объект, определяющий относительный путь к источнику привязки |
UpdateSourceTrigger |
UpdateSourceTrigger |
Объект, определяющий некоторое событие в результате которого производится обновление источника привязки. Может принимать следующие значения:
|
IsAsync |
bool |
Если установлено в True, то использует асинхронный режим получения данных из объекта. По умолчанию равно False |
С рядом этих свойств мы уже познакомились в предыдущей части. В этой же части мы остановимся более детально на режимах привязки.
Режимы привязки (свойство Mode)
За режим привязки отвечает свойство Mode, которое по умолчанию имеет значение Default, то есть используется тот режим, который передается в метаданных свойства зависимостей. Рассмотрим как работают другие режимы привязки.
Режим привязки OneWay
Режим привязки OneWay можно представить следующим образом:
Это наиболее часто используемый режим привязки в WPF. При таком режиме обновляется только свойство цели после изменения свойства источника. Изменение же свойства у цели никак не отражается на свойстве источника. В качестве примера, рассмотрим действие этого режима для двух элементов TextBox.
<StackPanel>
<TextBox Margin="10" x:Name="Source"/>
<TextBox Margin="10" Text="{Binding ElementName=Source, Path=Text, Mode=OneWay}"/>
</StackPanel>
Здесь источником выступает первый элемент TextBox, а для второго элемента установлена привязка с режимом OneWay. Теперь изменения в первом текстовом поле будет приводить к обновлению текста во втором поле, но не наоборот:
Режим привязки TwoWay
Режим привязки TwoWay можно представить следующим образом:
Этот режим привязки используется реже и требует больше вычислений, однако его преимущество заключается в том, что мы можем обновлять как цель на основании изменений в источнике, так и наоборот — обновлять свойство источника при изменении свойства цели. Например, такой режим привязки по умолчанию устанавливается все для того же свойства Text у TextBox, поэтому, для демонстрации режима TwoWay достаточно изменить наш пример следующим образом:
<StackPanel>
<TextBox Margin="10" x:Name="Source"/>
<TextBox Margin="10" Text="{Binding ElementName=Source, Path=Text}"/>
</StackPanel>
Мы просто убрали параметр Mode из выражения привязки. Теперь оба TextBox будут обновляться в зависимости от значений:
Обратите внимание на то, как влияет изменение свойства цели на изменение свойства источника — источник получает новое значение только когда второе поле ввода (цель) теряет фокус. Причина такого поведения кроется в свойстве UpdateSourceTrigger , которое у TextBox имеет значение LostFocus. Чтобы оба поля ввода синхронно меняли свое значение, достаточно определить значение UpdateSourceTrigger следующим образом:
<StackPanel>
<TextBox Margin="10" x:Name="Source"/>
<TextBox Margin="10" Text="{Binding ElementName=Source, Path=Text, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
Теперь значение свойства источника будет меняться сразу же после изменения свойства цели:
Режим привязки OneTime
Этот режим похож на режим OneTime, но только с одним существенным различием — свойство цели устанавливается только один раз. Применим этот режим к нашему примеру:
<StackPanel>
<TextBox Margin="10" x:Name="Source" Text="Этот текст будет использован только один раз"/>
<TextBox Margin="10" Text="{Binding ElementName=Source, Path=Text, Mode=OneTime}"/>
</StackPanel>
Здесь мы задали текст для свойства источника, чтобы увидеть действие режима OneTime. Сразу после запуска сработает привязка, но в дальнейшем изменение свойства источника никак не скажется на свойстве цели:
Режим привязки OneWayToSource
Этот режим аналогичен режиму OneWay, но только действует в обратную сторону:
<StackPanel>
<TextBox Margin="10" x:Name="Source"/>
<TextBox Margin="10" Text="{Binding ElementName=Source, Path=Text, Mode=OneWayToSource}"/>
</StackPanel>
В результате мы получим следующее поведение элементов управления:
Итого
В привязке данных в WPF центральную роль занимает объект типа Binding. Этот тип предоставляет нам множество свойств, влияющих на процесс привязки данных. В этой части мы рассмотрели свойства Binding, а также детально остановились на режимах привязки в WPF. В WPF режимы привязки устанавливаются с использованием свойства Mode объекта Binding.






