Расширение разметки RelativeSource
Задает свойства RelativeSource источника привязки, которые будут использоваться в расширения разметки привязки, или при задании RelativeSource свойство Binding определенного в XAML.
Использование атрибута 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 ; соответствует RelativeSource , созданного с помощью его Mode свойство значение Self.-Строковая лексема TemplatedParent ; соответствует RelativeSource , созданного с помощью его Mode свойство значение TemplatedParent.-Строковая лексема PreviousData ; соответствует RelativeSource , созданного с помощью его Mode свойство значение PreviousData.-Сведения см. ниже на FindAncestor режим. |
FindAncestor |
Строковая лексема FindAncestor . Использовании этой лексемы осуществляет переход в режим, где RelativeSource задает тип предка и (при необходимости) уровень предка. Это соответствует RelativeSource при создании со свойством Mode, для которого задано значение FindAncestor. |
typeName |
Требуется для режима FindAncestor . Имя типа, которое заполняет свойство AncestorType. |
intLevel |
Необязательно для режима FindAncestor . Уровень предка (вычисляется в направлении родителя в логическом дереве). |
Примечания
{RelativeSource TemplatedParent}
Использование привязки — это ключевая методика, которая решает большего размера концепцию разделения элемента управления пользовательского интерфейса и логики элемента управления. Это делает возможным привязку из определения шаблона к созданному по шаблону родительскому элементу (экземпляр объекта времени выполнения, в котором применяется шаблон). В этом случае расширения разметки TemplateBinding на самом деле является сокращением для следующего выражения привязки: {Binding RelativeSource={RelativeSource TemplatedParent}}
. TemplateBinding
или {RelativeSource TemplatedParent}
использования включены только соответствующие в XAML, который определяет шаблон. Дополнительные сведения см. в разделе расширения разметки TemplateBinding
{RelativeSource FindAncestor}
является главным образом используется в шаблонах элементов управления или прогнозируемый автономных композициях пользовательского интерфейса, для случаев, где элемент управления всегда должен быть в визуальном дереве определенного типа предка. Например, элементы в элементе управления элементами могут использовать вхождения FindAncestor
для привязки к свойствам предка элемента управления элементами. Либо элементы, которые являются частью композиции элемента управления в шаблоне, могут использовать привязки FindAncestor
к родительским элементам в той же структуре композиции.
В синтаксисе объектного элемента для режима FindAncestor
, показанного выше в разделах синтаксиса XAML, второй синтаксис объектного элемента используется специально для режима FindAncestor
. Режим FindAncestor
требует значения AncestorType. Необходимо задать AncestorType как атрибут расширение разметки x: Type ссылка на тип искомого предка. Значение AncestorType используется при обработке запроса привязки во время выполнения.
Для режима FindAncestor
необязательное свойство AncestorLevel может помочь устранить неоднозначность поиска предка в случаях, где в дереве элементов, возможно, существует более одного предка данного типа.
Дополнительные сведения об использовании режима FindAncestor
см. в разделе RelativeSource.
{RelativeSource Self}
полезно для сценариев, где одно свойство экземпляра должно зависеть от значения другого свойства и тот же экземпляр, и нет общего отношения свойства зависимостей (например, приведение) уже существует между этими двумя свойствами. Хотя изредка случается, что в объекте существует два свойства, таким образом, значения буквально одинаковыми (и идентичными типами), также можно применить Converter
параметр привязку, в которой {RelativeSource Self}
и использовать этот преобразователь выполнить преобразование между исходной и типы целевых объектов. Другой сценарий для {RelativeSource Self}
как часть MultiDataTrigger.
Например, следующий код XAML определяет такой элемент Rectangle, что независимо от того, какое значение вводится для свойства Width, объектом Rectangle всегда является квадрат: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>
{RelativeSource PreviousData}
используется в шаблонах данных, или в случаях, когда привязки используют коллекцию в качестве источника данных. Можно использовать {RelativeSource PreviousData}
для выделения связей между соседними элементами данных в коллекции. Соответствующей методикой является установление привязки MultiBinding между текущим и предыдущим элементами в источнике данных и использование преобразователя в этой привязке для определения различия между двумя элементами и их свойствами.
В следующем примере первый элемент TextBlock в шаблоне элементов отображает текущий номер. Второй TextBlock привязка является MultiBinding которая номинально состоит двух Binding составляющих: текущей записи и привязки, в которой намеренно используется предыдущая запись данных с помощью {RelativeSource PreviousData}
. Затем преобразователь в объекте MultiBinding вычисляет разницу и возвращает ее в привязку.
<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 обработка данного расширения разметки определяется RelativeSource класса.
RelativeSource
является расширением разметки. Расширения разметки обычно реализуются, если требуется заменить значения атрибутов на нелитеральные значения или имена обработчиков и если требуется больше, чем простая настройка преобразователей типов на работу с определенными типами или свойствами. Все расширения разметки в XAML используют {
и }
символов в синтаксисе их атрибутов, который является соглашением, по которому обработчик XAML узнает, что расширение разметки должно обработать атрибут. Дополнительные сведения см. в разделе Расширения разметки и XAML WPF.