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


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

Описание принципа привязки данных не рассматривается здесь, см. Общие сведения о связывании данных.

В реализации процессора XAML WPF обработка данного расширения разметки определяется классом RelativeSource.

RelativeSource является расширением разметки. Расширения разметки обычно реализуются, если требуется заменить значения атрибутов на нелитеральные значения или имена обработчиков и если требуется не только простая настройка преобразователей типов на работу с определенными типами или свойствами. Все расширения разметки в XAML используют символы { и } в синтаксисе их атрибутов, который является соглашением, по которому процессор XAML распознает, что расширение разметки должно обработать атрибут. Дополнительные сведения см. в разделе Расширения разметки и XAML WPF.

См. также

Ссылки

Binding

Расширение разметки x:Type

Основные понятия

Стилизация и использование шаблонов

Общие сведения о языке XAML (WPF)

Расширения разметки и XAML WPF

Общие сведения о связывании данных

Общие сведения об объявлении привязок