Compartilhar via


MarkupExtension do RelativeSource

Especifica as propriedades de um RelativeSource origem da ligação, para ser usado dentro de um Ligação de marcação de extensão, ou ao definir o RelativeSource propriedade de um Binding elemento estabelecida no XAML.

XAML Attribute Usage

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

XAML Attribute Usage (nested within Binding extension)

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

XAML Object Element Usage

<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 Values

modeEnumValue

One of the following:

FindAncestor

The string token FindAncestor. Using this token enters a mode whereby a RelativeSource specifies an ancestor type and optionally an ancestor level. This corresponds to a RelativeSource as created with its Mode property set to FindAncestor.

typeName

Required for FindAncestor mode. The name of a type, which fills the AncestorType property.

intLevel

Optional for FindAncestor mode. An ancestor level (evaluated towards the parent direction in the logical tree).

Comentários

{RelativeSource TemplatedParent}usos de ligação são uma técnica de chave que aborda um conceito maior do que a separação de interface de usuário do controle e a lógica de um controle. Isso permite que a vinculação de dentro da definição de modelo ao pai do modelo (tempo de execução instância do objeto onde o modelo é aplicado). Nesse caso, o Extensão de linguagem de marcação TemplateBinding é na verdade um atalho para a seguinte expressão de vinculação: {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBindingou {RelativeSource TemplatedParent} usos são relevantes apenas dentro do XAML que define um modelo. For more information, see Extensão de linguagem de marcação TemplateBinding

{RelativeSource FindAncestor}é usado principalmente em modelos de controle ou composições de UI independentes previsíveis, para os casos onde um controle é sempre espera uma árvore visual de um determinado tipo de ancestral. Por exemplo, podem usar os itens de um controle de itens FindAncestor de controle usos para vincular propriedades de seus itens pai ancestral. Também podem usar os elementos que fazem parte da composição de controle em um modelo de FindAncestor ligações aos elementos pai dessa mesma estrutura de composição.

Na sintaxe de elemento de objeto para FindAncestor modo mostrado nas seções a sintaxe XAML, a segunda sintaxe de elemento de objeto é usada especificamente para FindAncestor modo. FindAncestormodo requer um AncestorType valor. You must set AncestorType as an attribute using an Marcação de Extensão x:Type reference to the type of ancestor to look for. The AncestorType value is used when the binding request is processed at run-time.

For FindAncestor mode, the optional property AncestorLevel can help disambiguate the ancestor lookup in cases where there is possibly more than one ancestor of that type existing in the element tree.

Para obter mais informações sobre como usar o FindAncestor modo, consulte RelativeSource.

{RelativeSource Self}é útil para cenários onde uma propriedade de uma instância deve depender do valor da propriedade de outro da mesma instância e nenhuma relação de propriedade de dependência geral (como a coerção) já existe entre essas duas propriedades. Embora seja raro que existem de duas propriedades em um objeto de modo que os valores são idênticos literalmente (e são digitados de forma idêntica), você também pode aplicar uma Converter parâmetro para uma ligação que tem {RelativeSource Self}e usar o conversor para converter entre tipos de origem e destino. Outro cenário para {RelativeSource Self} é como parte de um MultiDataTrigger.

Por exemplo, o XAML a seguir define uma Rectangle elemento tal que não importa qual o valor inserido para Width, o Rectangle é sempre um quadrado: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData}é útil em modelos de dados ou em casos onde a ligações estão usando uma coleção como fonte de dados. Você pode usar {RelativeSource PreviousData} para realçar as relações entre itens de dados adjacentes na coleção. Uma técnica relacionada é estabelecer um MultiBinding entre os itens atuais e anteriores a fonte de dados e o uso de um conversor que ligação para determinar a diferença entre os dois itens e suas propriedades.

No exemplo a seguir, o primeiro TextBlock nos itens de modelo exibe o número atual. A segunda TextBlock a ligação é um MultiBinding que tem dois nominally Binding consistuents: o registro atual e uma ligação que deliberadamente usa o registro de dados anterior usando {RelativeSource PreviousData}. Em seguida, um conversor na MultiBinding calcula a diferença e o retorna à ligação.

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

Describing data binding as a concept is not covered here, see Revisão de Associação de Dados.

No WPF implementação do processador XAML, o tratamento para a extensão de marcação é definido pelo RelativeSource classe.

RelativeSource is a markup extension. Markup extensions are typically implemented when there is a requirement to escape attribute values to be other than literal values or handler names, and the requirement is more global than just putting type converters on certain types or properties. Todas as extensões de marcação no uso do XAML a { e } caracteres em sua sintaxe de atributo, que é a convenção pelo qual um processador XAML reconhece que a extensão de marcação deve processar o atributo. For more information, see As extensões de marcação e o WPF XAML.

Consulte também

Referência

Binding

Marcação de Extensão x:Type

Conceitos

Styling and Templating

Visão geral do XAML (WPF)

As extensões de marcação e o WPF XAML

Revisão de Associação de Dados

Resumo de Declaração de Associações