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