Partilhar via


Extensão de marcação {RelativeSource}

Fornece um meio para especificar a origem de uma associação em termos de uma relação relativa no gráfico de objeto de tempo de execução.

Uso de atributos XAML (modo Self)

<Binding RelativeSource="{RelativeSource Self}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource Self} ...}" .../>

Uso de atributos XAML (modo TemplatedParent)

<Binding RelativeSource="{RelativeSource TemplatedParent}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource TemplatedParent} ...}" .../>

Valores XAML

Term Description
{RelativeSource Self} Produz um valor Mode de Self. O elemento de destino deve ser usado como fonte para essa ligação. Isso é útil para vincular uma propriedade de um elemento a outra propriedade no mesmo elemento.
{RelativeSource TemplatedParent} Produz um ControlTemplate que é aplicado como a origem para esta associação. Isso é útil para aplicar informações de tempo de execução a associações no nível do modelo.

Observações

Um Binding pode definir Binding.RelativeSource como um atributo em um elemento de objeto Binding ou como um componente dentro de uma extensão de marcação {Binding}. É por isso que duas sintaxes XAML diferentes são mostradas.

RelativeSource é semelhante à extensão de marcação {Binding}. É uma extensão de marcação que é capaz de retornar instâncias de si própria e suportar uma construção com base em cadeia de caracteres que, essencialmente, passa um argumento para o construtor. Nesse caso, o argumento que está sendo passado é o valor Modo .

O modo Self é útil para vincular uma propriedade de um elemento a outra propriedade no mesmo elemento e é uma variação na vinculação ElementName , mas não requer nomear e, em seguida, fazer autorreferência ao elemento. Se você vincular uma propriedade de um elemento a outra propriedade no mesmo elemento, as propriedades deverão usar o mesmo tipo de propriedade ou você também deverá usar um Converter na associação para converter os valores. Por exemplo, você poderia usar Height como uma fonte para Width sem conversão, mas precisaria de um conversor para usar IsEnabled como uma fonte para Visibility.

Eis um exemplo. Este retângulo usa uma extensão de marcação {Binding} para que sua Altura e Largura sejam sempre iguais e renderize como um quadrado. Apenas a Altura é definida como um valor fixo. Para este retângulo , seu DataContext padrão é null, não este. Portanto, para estabelecer a fonte de contexto de dados como sendo o próprio objeto (e permitir a vinculação a suas outras propriedades), usamos o RelativeSource={RelativeSource Self} argumento no uso da extensão de marcação {Binding}.

<Rectangle
  Fill="Orange" Width="200"
  Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
/>

Outro uso de RelativeSource={RelativeSource Self} é definir o DataContext de um objeto para o próprio objeto. Por exemplo, pode ver esta técnica em alguns dos exemplos do SDK nos quais a classe Page foi estendida com uma propriedade personalizada que já está fornecendo um modelo de exibição pronto a usar para a sua própria ligação de dados, como: <common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">

Observação O uso de XAML para RelativeSource mostra apenas o uso a que se destina: definir um valor para Binding.RelativeSource em XAML como parte de uma expressão de ligação. Teoricamente, outros usos são possíveis se definir uma propriedade onde o valor é RelativeSource.