Extensão de marcação {RelativeSource}

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

Uso de atributo XAML (modo próprio)

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

Uso do atributo XAML (modo TemplatedParent)

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

Valores XAML

Termo Descrição
{RelativeSource Self} Produz um valor Mode de Self. O elemento de destino deve ser usado como a origem para essa associaçã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 dessa associação. Isso é útil para aplicar informações de tempo de execução a associações no nível do modelo.

Comentários

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 capaz de retornar instâncias de si mesma e dar suporte a uma construção baseada em cadeia de caracteres que essencialmente passa um argumento para o construtor. Nesse caso, o argumento que está sendo passado é o valor Mode.

O modo Self é útil para associar uma propriedade de um elemento a outra propriedade no mesmo elemento e é uma variação da associação ElementName, mas não requer nomenclatura e, em seguida, autorreferenciar o 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ê pode usar Height como uma fonte para Width sem conversão, mas precisaria de um conversor para usar IsEnabled como uma fonte para Visibility.

Veja um exemplo. Esse retângulo usa uma extensão de marcação {Binding} para que sua altura e largura sejam sempre iguais e seja renderizado como um quadrado. Somente a Altura é definida como um valor fixo. Para este Rectangle, seu DataContext padrão é nulo, não this. Portanto, para estabelecer que a fonte de contexto de dados é o próprio objeto (e habilitar a associaçã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 é como uma maneira de RelativeSource={RelativeSource Self} definir o DataContext de um objeto para si mesmo. Por exemplo, você pode ver essa técnica em alguns dos exemplos de SDK em que a classe Page foi estendida com uma propriedade personalizada que já está fornecendo um modelo de exibição pronto para uso para sua própria associação de dados, como: <common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">

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