Привязка в WPF. Относительная привязка

Относительная привязка (relative binding) позволяет задавать источник привязки относительно положения целевого объекта в визуальном дереве элементов. Относительные привязки задаются с использованием расширения разметки RelativeSource. Мы уже использовали относительную привязку в WPF, когда разбирались со свойствами зависимостей. В этой части мы рассмотрим относительную привязку в WPF более детально.

Свойства RelativeSource

Чтобы воспользоваться относительной привязкой в WPF, мы должны использовать свойство RelativeSource объекта Binding, в которое передать объект типа RelativeSource. Класс RelativeSource предоставляет нам следующие свойства:

Свойство Тип Описание
Mode  RelativeBindingSourceMode  Режим относительной привязки. Может принимать следующие значения:

  • TemplatedParent — используется для установки привязки внутри шаблона элемента.
  • Self — привязка к самому себе
  • FindAncestor — указывает на контейнер в визуальном дереве элементов, в котором необходимо искать объект-источник привязки.
  • PreviousData — позволяет привязать предыдущий элемент данных к списку отображаемых элементов данных.
AncestorLevel  int  Уровень элементов в визуальном дереве относительно контейнера, где будет вестись поиск объекта-источника привязки (используется, если свойство Mode имеет значение FindAncestor)
AncestorType  Type  Определяет тип элементов, среди которых будет производиться поиск объекта-источника привязки (используется, если свойство Mode имеет значение FindAncestor)

Рассмотрим как можно использовать относительную привязку в своих приложениях WPF.

Привязка к самому себе (Mode=Self)

Это наиболее простой режим относительной привязки. Например, напишем следующий код XAML:

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <Rectangle Margin="10" 
                   Width="{Binding ElementName=WidthSlider, Path=Value}" 
                   Height="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Width}" Stroke="Red"/>
        <Slider x:Name="WidthSlider" Margin="10" Maximum="450" Minimum="50"/>
    </StackPanel>
</Window>

Здесь свойство Width элемента Rectangle использует обычную привязку и привязано к значению Value слайдера WidthSlider.

В свою очередь свойство Height привязывается к самом себе, а именно — к свойству Width. Таким образом, и ширина и высота Rectangle будут меняться одинаково при изменении значения Value и слайдера:

RelativeSource: относительная привязка WPFОтносительная привязка к предку (Mode=FindAncestor)

Режим FindAncestor используется для привязки к родительским элементам в визуальном дереве. При этом родительский элемент не обязательно должен быть контейнером компоновки.

Например, рассмотрим следующий код:

<StackPanel>
    <Border Background="Blue" 
            Width="{Binding ElementName=WidthSlider, Path=Value}"
            Height="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Width}">
        <Rectangle Margin="10" 
                   Width="{Binding RelativeSource={RelativeSource AncestorType=Border}, Path=Width}" 
                   Height="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Width}" 
                   Stroke="Red"
                   Fill="Green">
        </Rectangle>
    </Border>
    
    <Slider x:Name="WidthSlider" Margin="10" Maximum="450" Minimum="50"/>
</StackPanel>

Здесь прямоугольник Rectangle размещается внутри элемента Border, то есть Border — это родительский элемент для Rectangle. В свою очередь, Rectangle, используя относительную привязку, привязывается к свойству Width родительского элемента, а свойство Height привязывается к своему же свойство Width. Таким образом, регулируя ширину Border мы одновременно изменяем сразу несколько свойств элементов — высоту Border, ширину Rectangle и, через это изменение — высоту Rectangle. В запущенном приложении это будет выглядеть следующим образом:

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

Width="{Binding RelativeSource={RelativeSource AncestorType=Border}, Path=Width}"

указав тип предка.

Итого

Относительная привязка в WPF позволяет привязываться к объектам и их свойствам относительно положения целевого объекта в визуальном дереве. Используя относительную привязку мы можем привязываться либо к самом себе, либо к родительским элементам.

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