RelativeSource MarkupExtension

Especifica as propriedades de uma fonte de vinculação, a serem usadas em uma RelativeSourceExtensão de Marcação de Vinculação ou ao definir a RelativeSource propriedade de um Binding elemento estabelecido em XAML.

Uso do Atributo XAML

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

Uso de atributo XAML (aninhado em uma extensão de associação)

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

Uso de elemento Object do XAML

<Binding>
  <Binding.RelativeSource>
    <RelativeSource Mode="modeEnumValue"/>
  </Binding.RelativeSource>
</Binding>

-ou-

<Binding>
  <Binding.RelativeSource>
    <RelativeSource
      Mode="FindAncestor"
      AncestorType="{x:Type typeName}"
      AncestorLevel="intLevel"
    />
  </Binding.RelativeSource>
</Binding>

Valores XAML

Valor Descrição
modeEnumValue Um dos seguintes:

- O token Selfstring ; corresponde a um RelativeSource como criado com sua Mode propriedade definida como Self.
- O token TemplatedParentstring ; corresponde a um RelativeSource como criado com sua Mode propriedade definida como TemplatedParent.
- O token PreviousDatastring ; corresponde a um RelativeSource como criado com sua Mode propriedade definida como PreviousData.
– Veja abaixo para obter informações sobre o modo FindAncestor.
FindAncestor O token da cadeia de caracteres FindAncestor. Ao usar este token entra-se em um modo por meio do qual RelativeSource especifica um tipo de ancestral e opcionalmente um nível de ancestral. Isso corresponde a RelativeSource, conforme criado com a propriedade Mode, definida como FindAncestor.
typeName Necessário para o modo FindAncestor. O nome de um tipo que preenche a propriedade AncestorType.
intLevel Opcional para o modo FindAncestor. Um nível de ancestral (avaliado de acordo com a direção do pai na árvore lógica).

Comentários

Usos de associação {RelativeSource TemplatedParent} são técnicas-chave que atendem a um conceito maior de separação de uma interface do usuário do controle e uma lógica do controle. Isso habilita a associação a partir da definição de modelo a um pai modelo (instância do objeto de tempo de execução em que o modelo é aplicado). Nesse caso, a Extensão de Marcação TemplateBinding é, na verdade, uma abreviação da seguinte expressão de associação: {Binding RelativeSource={RelativeSource TemplatedParent}}. Os usos TemplateBinding ou {RelativeSource TemplatedParent} são ambos relevantes apenas no XAML que define um modelo. Para obter mais informações, consulte TemplateBinding Markup Extension.

O {RelativeSource FindAncestor} é usado principalmente em modelos de controle ou em composições de interface do usuário independentes previsíveis para casos em que um controle deve estar sempre em uma árvore visual de um determinado tipo de ancestral. Por exemplo, os itens de um controle de itens podem utilizar os usos FindAncestor para se associar às propriedades do ancestral pai do controle de itens. Ou, os elementos que fazem parte da composição de controle em um modelo podem usar associações FindAncestor para elementos pai na mesma estrutura da composição.

Na sintaxe de elemento de objeto do modo FindAncestor exibida nas seções de Sintaxe XAML, a segunda sintaxe de elemento de objeto é usada especificamente para o modo FindAncestor. O modo FindAncestor requer um valor AncestorType. Você deve definir AncestorType como um atributo usando uma referência x:Type Markup Extension para o tipo de ancestral a ser procurado. O valor AncestorType é usado quando a requisição de associação é processada em tempo de execução.

Para o modo FindAncestor, a propriedade opcional AncestorLevel pode ajudar a desambiguar a consulta de ancestral em casos em que exista possivelmente mais de um ancestral daquele tipo na árvore de elemento.

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

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

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

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

No exemplo a seguir, o primeiro TextBlock no modelo de itens exibe o número atual. A segunda TextBlock vinculação é uma que nominalmente tem dois Binding constituintes: o registro atual e uma MultiBinding vinculação que usa deliberadamente o registro de dados anterior usando {RelativeSource PreviousData}. Em seguida, um conversor em MultiBinding calcula a diferença e retorne à associaçã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>
</ListBox>

A descrição de vinculação de dados como um conceito não é abordado aqui; consulte Visão geral de vinculação de dados.

Na implementação do processador XAML do WPF, o tratamento para essa extensão de marcação é definido pela RelativeSource classe.

RelativeSource é uma extensão da marcação. Extensões de marcação são tipicamente implementadas quando existe um requisito que permite que valores de atributo sejam diferentes de valores literais ou nomes de manipuladores, e o requisito é mais global do que simplesmente colocar conversores de tipo em certos tipos ou propriedades. Todas as extensões de marcação em XAML usam os caracteres { e } na sintaxe de atributo, que é a convenção pela qual o processador XAML reconhece que uma extensão de marcação precisa processar o atributo. Para obter mais informações, consulte Extensões de marcação e XAML do WPF.

Confira também