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


Расширение разметки {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.

Режим Self подходит для привязки одного свойства элемента к другому свойству того же элемента и является вариантом привязки с использованием 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.