Привязка в WPF. Свойства Binding, режимы привязки

Из предыдущей части мы узнали в общих чертах, что из себя представляет привязка в WPF. Теперь мы более подробно разберемся с тем как работает привязка в WPF, какие параметры мы можем использовать в выражениях привязки и изучим режимы привязки в WPF. Привязка данных в WPF осуществляется с использованием объектов типа Binding на свойствах которого мы сегодня и остановимся. Свойства Binding в коде XAML выступают в качестве параметров выражения и одним из важнейших свойств этого типа является свойство отвечающее за режимы привязки.

Свойства Binding

В начале рассмотрим в общих чертах свойства Binding, а, затем, изучим влияние различных значений этих свойств на привязку данных в WPF более подробно. Тип Binding предоставляет нам достаточно много различных свойств, однако, среди них можно выделить ряд свойств, которые используются в приложениях наиболее часто:

Свойство Тип Описание
Converter IValueConverter Получает или задает используемый конвертер значений. О конвертерах значений будет отдельная часть.
ConverterCulture CultureInfo Получает или задает язык и региональные параметры для конвертера значений
ConverterParameter object Необязательный параметр для конвертера значений
ElementName string Имя объекта-источника привязки
Mode BindingMode Режим привязки. Может принимать одно из следующих значений:

  • TwoWay
  • OneWay
  • OneTime
  • OneWayToSource
  • Default
Path PropertyPath Путь к свойству источника привязки
Source object Объект-источник привязки
RelativeSource RelativeSource Объект, определяющий относительный путь к источнику привязки
UpdateSourceTrigger UpdateSourceTrigger Объект, определяющий некоторое событие в результате которого производится обновление источника привязки. Может принимать следующие значения:

  • Default
  • PropertyChanged
  • LostFocus
  • Explicit
IsAsync bool  Если установлено в True, то использует асинхронный режим получения данных из объекта. По умолчанию равно False

С рядом этих свойств мы уже познакомились в предыдущей части. В этой же части мы остановимся более детально на режимах привязки.

Режимы привязки (свойство Mode)

За режим привязки отвечает свойство Mode, которое по умолчанию имеет значение Default, то есть используется тот режим, который передается в метаданных свойства зависимостей. Рассмотрим как работают другие режимы привязки.

Режим привязки OneWay

Режим привязки OneWay можно представить следующим образом: Режимы привязки WPF. Режим OneWayЭто наиболее часто используемый режим привязки в WPF. При таком режиме обновляется только свойство цели после изменения свойства источника. Изменение же свойства у цели никак не отражается на свойстве источника. В качестве примера, рассмотрим действие этого режима для двух элементов TextBox.

<StackPanel>
    <TextBox Margin="10" x:Name="Source"/>
    <TextBox Margin="10" Text="{Binding ElementName=Source, Path=Text, Mode=OneWay}"/>
</StackPanel>

Здесь источником выступает первый элемент TextBox, а для второго элемента установлена привязка с режимом OneWay. Теперь изменения в первом текстовом поле будет приводить к обновлению текста во втором поле, но не наоборот:

Режим привязки OneWay

Режим привязки TwoWay

Режим привязки TwoWay можно представить следующим образом:

Режимы привязки. Режим TwoWay

Этот режим привязки используется реже и требует больше вычислений, однако его преимущество заключается в том, что мы можем обновлять как цель на основании изменений в источнике, так и наоборот — обновлять свойство источника при изменении свойства цели. Например, такой режим привязки по умолчанию устанавливается все для того же свойства Text у TextBox, поэтому, для демонстрации режима TwoWay достаточно изменить наш пример следующим образом:

<StackPanel>
    <TextBox Margin="10" x:Name="Source"/>
    <TextBox Margin="10" Text="{Binding ElementName=Source, Path=Text}"/>
</StackPanel>

Мы просто убрали параметр Mode из выражения привязки. Теперь оба TextBox будут обновляться в зависимости от значений:

Режимы привязки в WPF. Режим TwoWay

Обратите внимание на то, как влияет изменение свойства цели на изменение свойства источника — источник получает новое значение только когда второе поле ввода (цель) теряет фокус. Причина такого поведения кроется в свойстве UpdateSourceTrigger , которое у TextBox имеет значение LostFocus. Чтобы оба поля ввода синхронно меняли свое значение, достаточно определить значение UpdateSourceTrigger следующим образом:

<StackPanel>
    <TextBox Margin="10" x:Name="Source"/>
    <TextBox Margin="10" Text="{Binding ElementName=Source, Path=Text, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>

Теперь значение свойства источника будет меняться сразу же после изменения свойства цели:

Режимы привязки WPF. Режим TwoWay

Режим привязки OneTime

Этот режим похож на режим OneTime, но только с одним существенным различием — свойство цели устанавливается только один раз. Применим этот режим к нашему примеру:

<StackPanel>
    <TextBox Margin="10" x:Name="Source" Text="Этот текст будет использован только один раз"/>
    <TextBox Margin="10" Text="{Binding ElementName=Source, Path=Text, Mode=OneTime}"/>
</StackPanel>

Здесь мы задали текст для свойства источника, чтобы увидеть действие режима OneTime. Сразу после запуска сработает привязка, но в дальнейшем изменение свойства источника никак не скажется на свойстве цели:

Режимы привязки в WPF. Режим OneTime

Режим привязки OneWayToSource

Этот режим аналогичен режиму OneWay, но только действует в обратную сторону:

Режимы привязки в WPF. Режим OneWayToSource

<StackPanel>
    <TextBox Margin="10" x:Name="Source"/>
    <TextBox Margin="10" Text="{Binding ElementName=Source, Path=Text, Mode=OneWayToSource}"/>
</StackPanel>

В результате мы получим следующее поведение элементов управления:

Режимы привязки в WPF. Режим OneWayToSource

Итого

В привязке данных в WPF центральную роль занимает объект типа Binding. Этот тип предоставляет нам множество свойств, влияющих на процесс привязки данных. В этой части мы рассмотрели свойства Binding, а также детально остановились на режимах привязки в WPF. В WPF режимы привязки устанавливаются с использованием свойства Mode объекта Binding.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии