Show / Hide Table of Contents

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

См. также

  • Binding
  • Стилизация и использование шаблонов
  • Общие сведения о языке XAML (WPF)
  • Расширения разметки и XAML WPF
  • Общие сведения о привязке данных
  • Общие сведения об объявлении привязок
  • Расширение разметки x:Type
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX