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.
См. также
- Binding
- Стили и шаблоны
- XAML в WPF
- расширения разметки и XAML WPF
- Обзор привязки данных
- Обзор объявлений привязки
- расширения разметки x:Type
.NET Desktop feedback