Расширение разметки RelativeSource
Задает свойства Relative
Использование атрибута XAML
<Binding RelativeSource="{RelativeSource modeEnumValue}" .../>
Использование атрибута XAML (вложенный в расширение Binding)
<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" .../>
Использование элемента объекта XAML
<Binding>
<Binding.RelativeSource>
<RelativeSource Mode="modeEnumValue"/>
</Binding.RelativeSource>
</Binding>
- или -
<Binding>
<Binding.RelativeSource>
<RelativeSource
Mode="FindAncestor"
AncestorType="{x:Type typeName}"
AncestorLevel="intLevel"
/>
</Binding.RelativeSource>
</Binding>
Значения XAML
modeEnumValue |
Один из следующих вариантов: -Строковая лексема Self; соответствует Relative-Строковая лексема TemplatedParent; соответствует Relative-Строковая лексема PreviousData; соответствует Relative-Сведения см. ниже на FindAncestor режим. |
FindAncestor |
Строковая лексема FindAncestor. Использовании этой лексемы осуществляет переход в режим, где RelativeSource задает тип предка и (при необходимости) уровень предка. Это соответствует Relative |
typeName |
Требуется для режима FindAncestor. Имя типа, которое заполняет свойство Ancestor |
intLevel |
Необязательно для режима FindAncestor. Уровень предка (вычисляется в направлении родителя в логическом дереве). |
Примечания
{RelativeSource TemplatedParent} Использование привязки — это ключевая методика, которая решает большего размера концепцию разделения элемента управления пользовательского интерфейса и логики элемента управления. Это делает возможным привязку из определения шаблона к созданному по шаблону родительскому элементу (экземпляр объекта времени выполнения, в котором применяется шаблон). В этом случае расширения разметки TemplateBinding на самом деле является сокращением для следующего выражения привязки: {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBinding или {RelativeSource TemplatedParent} использования включены только соответствующие в XAML, который определяет шаблон. Дополнительные сведения см. в разделе расширения разметки TemplateBinding
{RelativeSource FindAncestor} является главным образом используется в шаблонах элементов управления или прогнозируемый автономных композициях пользовательского интерфейса, для случаев, где элемент управления всегда должен быть в визуальном дереве определенного типа предка. Например, элементы в элементе управления элементами могут использовать вхождения FindAncestor для привязки к свойствам предка элемента управления элементами. Либо элементы, которые являются частью композиции элемента управления в шаблоне, могут использовать привязки FindAncestor к родительским элементам в той же структуре композиции.
В синтаксисе объектного элемента для режима FindAncestor, показанного выше в разделах синтаксиса XAML, второй синтаксис объектного элемента используется специально для режима FindAncestor. Режим FindAncestor требует значения Ancestor
Для режима FindAncestor необязательное свойство Ancestor
Дополнительные сведения об использовании режима FindAncestor см. в разделе Relative
{RelativeSource Self} полезно для сценариев, где одно свойство экземпляра должно зависеть от значения другого свойства и тот же экземпляр, и нет общего отношения свойства зависимостей (например, приведение) уже существует между этими двумя свойствами. Хотя изредка случается, что в объекте существует два свойства, таким образом, значения буквально одинаковыми (и идентичными типами), также можно применить Converter параметр привязку, в которой {RelativeSource Self}и использовать этот преобразователь выполнить преобразование между исходной и типы целевых объектов. Другой сценарий для {RelativeSource Self} как часть Multi
Например, следующий код XAML определяет такой элемент Rectangle, что независимо от того, какое значение вводится для свойства Width, объектом Rectangle всегда является квадрат: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>
{RelativeSource PreviousData} используется в шаблонах данных, или в случаях, когда привязки используют коллекцию в качестве источника данных. Можно использовать {RelativeSource PreviousData} для выделения связей между соседними элементами данных в коллекции. Соответствующей методикой является установление привязки Multi
В следующем примере первый элемент Text{RelativeSource PreviousData}. Затем преобразователь в объекте Multi
<ListBox Name="fibolist">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding}"/>
<TextBlock>, difference = </TextBlock>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource DiffConverter}">
<Binding/>
<Binding RelativeSource="{RelativeSource PreviousData}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
Описание привязки данных, так как не рассматриваются здесь, см. в разделе Общие сведения о привязке данных.
В WPF реализации обработчика XAML обработка данного расширения разметки определяется Relative
RelativeSource является расширением разметки. Расширения разметки обычно реализуются, если требуется заменить значения атрибутов на нелитеральные значения или имена обработчиков и если требуется больше, чем простая настройка преобразователей типов на работу с определенными типами или свойствами. Все расширения разметки в XAML используют { и } символов в синтаксисе их атрибутов, который является соглашением, по которому обработчик XAML узнает, что расширение разметки должно обработать атрибут. Дополнительные сведения см. в разделе Расширения разметки и XAML WPF.