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


RelativeSource MarkupExtension

Указывает свойства источника привязки RelativeSource, используемый в расширении разметки привязки или при настройке свойства RelativeSource элемента Binding, установленного в XAML.

Использование атрибута XAML

<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />

Использование атрибутов XAML (вложенное в расширение привязки)

<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>
</ListBox>

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

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

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

См. также