Поделиться через


Расширение разметки {RelativeSource}

Предоставляет средства для указания источника привязки с точки зрения относительной связи в графе объектов во время выполнения.

Использование атрибутов XAML (автономный режим)

<Binding RelativeSource="{RelativeSource Self}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource Self} ...}" .../>

Использование атрибута XAML (режим TemplatedParent)

<Binding RelativeSource="{RelativeSource TemplatedParent}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource TemplatedParent} ...}" .../>

Значения XAML

Срок Description
{RelativeSource Self} Создает значение режима self. Целевой элемент должен использоваться в качестве источника для этой привязки. Это полезно для привязки одного свойства элемента к другому свойству того же элемента.
{RelativeSource TemplatedParent} Создает элемент ControlTemplate, применяемый в качестве источника для этой привязки. Это полезно для применения сведений среды выполнения к привязкам на уровне шаблона.

Замечания

Привязка может задать Binding.RelativeSource в качестве атрибута в элементе объекта Binding или в качестве компонента в расширении разметки {Binding}. Поэтому показаны два разных синтаксиса XAML.

RelativeSource аналогичен расширению разметки {Binding}. Это расширение разметки, которое может возвращать сами экземпляры и поддерживать построение на основе строк, которое, по сути, передает аргумент конструктору. В этом случае аргумент, передаваемый, является значением Mode.

Режим самообслуживания подходит для привязки одного свойства элемента к другому свойству того же элемента и является вариантом привязки ElementName , но не требует именования, а затем самоназванивание элемента. Если привязать одно свойство элемента к другому свойству одного и того же элемента, свойства должны использовать один и тот же тип свойства или также использовать преобразователь для преобразования значений. Например, вы можете использовать Height в качестве источника для ширины без преобразования, но вам потребуется преобразователь для использования IsEnabled в качестве источника видимости.

Рассмотрим пример. Этот прямоугольник использует расширение разметки {Binding}, чтобы его высота и ширина всегда равны, и он отображается в виде квадрата. Только высота задается как фиксированное значение. Для этого прямоугольника по умолчанию DataContext имеет значение NULL, а не это. Таким образом, чтобы установить источник контекста данных для самого объекта (и включить привязку к другим свойствам), мы используем RelativeSource={RelativeSource Self} аргумент в использовании расширения разметки {Binding}.

<Rectangle
  Fill="Orange" Width="200"
  Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
/>

Другое использование RelativeSource={RelativeSource Self} заключается в том, чтобы задать для себя dataContext объекта. Например, этот метод можно увидеть в некоторых примерах пакета SDK, в которых класс Page был расширен с пользовательским свойством, которое уже предоставляет модель представления готового к переходу для собственной привязки данных, например: <common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">

Обратите внимание , что использование XAML для RelativeSource показывает только использование, для которого оно предназначено: задание значения Binding.RelativeSource в XAML в рамках выражения привязки. Теоретически другие способы использования возможны, если задать свойство, в котором значение — RelativeSource.