Содержание
Режим привязки в .NET MAUI определяет в какую сторону будет работать привязка: от источника к цели, от цели к источнику, в обе стороны и так далее.
Режимы привязок в .NET MAUI
Все возможные режимы привязки в .NET MAUI определены в перечислении Binding
:
Значение | Описание | |
Default |
4 |
Значение по умолчанию, установленное целевого объекта. |
OneTime |
2 |
Целевой объект привязки обновляется при запуске приложения или при изменении контекста данных. |
OneWay |
1 |
Обновляется только свойство целевого объекта привязки в случае изменения источника. |
OneWayToSource |
3 |
Обновляется только свойство источника привязки при изменении цели. |
TwoWay |
0 |
Автоматически обновляются свойства и цели и источника. Если меняется свойство источника, то автоматически меняется и привязанное свойство цели и наоборот |
В .NET MAUI различные элементы управления и их отдельные свойства могут иметь установленный по умолчанию режим привязки. В большинстве случаев, для свойства элемента управления устанавливается режим привязки OneWay, однако, для некоторых элементов управления может быть установлен режим TwoWay
. Например:
Элемент управления | Свойство |
DatePicker | Date |
Editor, Entry, SearchBar, и EntryCell | Text |
ListView | IsRefreshing |
MultiPage | SelectedItem |
Picker | SelectedIndex и SelectedItem |
Slider и Stepper | Value |
Switch | IsToggled |
SwitchCell | On |
TimePicker. | Time |
Рассмотрим применение различных режимов привязок в .NET MAUI на примерах.
Использование режима привязок
Для привязки мы будем использовать расширение разметки Binding
, с которым мы познакомились в предыдущей части. Чтобы установить режим привязки, отличный по установленного по умолчанию, используется параметр Mode
в котором указывается одно из значений Binding
.
Использование режима привязки по умолчанию (Default)
Рассмотрим следующим пример:
<Slider x:Name="SourceSlider" /> <Slider Value="{Binding Source={x:Reference SourceSlider}, Path=Value}"/> <Label Text="{Binding Source={x:Reference SourceSlider}, Path=Value}"/>
Элемент Slider
по умолчанию устанавливает режим привязки для свойства Value
как TwoWay
. На странице расположено два элемента Slider
, один из которых является источником привязки (с именем SourceSlider
), а второй слайдер и метка — цели привязки. Таким образом, изменение положения ползунка у источника, будет приводить к тому, что в метке будет отображаться текущее значение свойства Value
, а второй Slider
будет меняться синхронно с первым. В приложении это будет выглядеть следующим образом:
Использование режима OneTime
Этот тип привязки может оказаться полезным, если нужно инициализировать целевое свойство с использованием какого-либо значения из исходного свойства, а контекст данных заранее неизвестен.
Перепишем код XAML следующим образом:
<Slider x:Name="SourceSlider" Value="0.5" /> <Slider Value="{Binding Source={x:Reference SourceSlider}, Path=Value, Mode=OneTime}"/> <Label Text="{Binding Source={x:Reference SourceSlider}, Path=Value}"/>
Теперь второй слайдер получит только начальное значение из SourceSlider
и далее значение его свойства Value
не будет зависеть от значений в источнике. При запуске приложение оба слайдера будут содержать одно и то же значение — 0.5:
а далее — ни источник, ни целевой объект не будут синхронно обновляться
Использование режима OneWay
Этот тип привязки подходит, если привязываемый элемент управления неявно доступен только для чтения. То есть целевой объект привязки не может влиять на данные в источнике. Например, если вы получаете, какие-то данный из внешнего API, который не позволяет записывать данные, то лучше применить в этом случае режим OneWay
, чтобы избежать издержек, связанных с использованием двухсторонней привязки (TwoWay
).
Изменим режим привязки на OneWay
<Slider x:Name="SourceSlider" /> <Slider x:Name="TargetSource" Value="{Binding Source={x:Reference SourceSlider}, Path=Value, Mode=OneWay}"/> <Label Text="{Binding Source={x:Reference SourceSlider}, Path=Value}"/>
Теперь будет изменяться только второй слайдер при изменении первого.
Использование режима OneWayToSource
Этот режим работает противоположно предыдущему, то есть меняется только свойство источника привязки при изменении свойства целевого объекта. Например, такая привязка:
<Slider x:Name="SourceSlider" /> <Slider x:Name="TargetSource" Value="{Binding Source={x:Reference SourceSlider}, Path=Value, Mode=OneWayToSource}"/> <Label Text="{Binding Source={x:Reference SourceSlider}, Path=Value}"/>
приведет к тому, что при изменении значения Value
во втором слайдере будет изменяться и значение у SourceSlider
, однако изменение SourceSlider
никак не будет отражаться на положение ползунка в целевом объекте.
Использование режима TwoWay
Этот режим, с точки зрения влияния на производительность приложения, является наиболее затратным. В принципе, пример его использования продемонстрирован в самом первом примере. То есть, применительно к объектам Slider
вот такой код:
<Slider x:Name="SourceSlider" /> <Slider x:Name="TargetSource" Value="{Binding Source={x:Reference SourceSlider}, Path=Value, Mode=TwoWay}"/>
можно считать излишним, так как см.выше — свойство Value
у Slider
и так по умолчанию имеет режим TwoWay
.
Итого
Режим привязки в .NET MAUI можно задать в параметре Mode
расширения разметки Binding
. Режим привязки позволяет указать то, в каком направлении будут изменяться значения свойств источника и цели (в каком направлении будет действовать привязка).