Extensão de marcação RelativeSource

Applies to Windows and Windows Phone

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

Uso de atributos XAML (Modo por conta própria)

<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

TermoDescrição

{RelativeSource Self}

Produz uma RelativeSource na qual o valor de Mode é Self. O elemento de destino deve ser usado como fonte para essa ligação. Isso é útil para ligar uma propriedade de um elemento a outra propriedade do mesmo elemento.

{RelativeSource TemplatedParent}

Produz uma RelativeSource na qual o valor de Mode é TemplatedParent. Para controlar onde é aplicado um ControlTemplate é a fonte dessa ligação. Isso é útil para aplicar informações em tempo de execução a ligações em nível de modelo.

 

Comentários

Uma Binding pode definir a Binding.RelativeSource como um atributo em um elemento de objeto Binding ou como um componente em Binding markup extension. É por isso que são exibidas duas sintaxes XAML diferentes.

RelativeSource é similar a Binding por ser uma extensão de marcação capaz de retornar instâncias de si, suportando uma construção baseada em cadeias de caracteres que, essencialmente, passa um argumento para o construtor. Nesse caso, o argumento passado é o valor de Mode.

O modo Self é útil em casos nos quais o mesmo elemento deve ser usado como objeto de origem e objeto de destino de uma ligação, mas diferentes propriedades são a origem e o destino. Isso é útil para ligar uma propriedade de um elemento a outra propriedade do mesmo elemento, e é uma variação da ligação comElementName que não exige o nome e a autorreferência do elemento. Se você liga uma propriedade de um elemento a outra propriedade do mesmo elemento, as propriedades devem usar o mesmo tipo de propriedade, você também terá que usar um Converter na ligação para converter os valores. Por exemplo, é possível usar a Height como origem de Width sem conversão, mas seria necessário um conversor para usar a IsEnabled como origem de Visibility.

Veja um exemplo. Esse Rectangle utiliza um Binding e forma que seu Height e Width são sempre iguais e ele renderiza como um quadrado. Somente a Altura é definida como um valor fixo. Para esse Rectangle seu DataContext padrão é null, não this. Assim, para estabelecer a origem de contexto de dados como sendo o próprio objeto (e ativar o vínculo com suas outras propriedades) utilizamos o argumento RelativeSource={RelativeSource Self} no uso de Binding.


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

Outra técnica que pode ser útil é usar RelativeSource={RelativeSource Self} como uma maneira de definir o DataContext de um objeto para ele próprio, sendo que a classe Page foi estendida com uma propriedade personalizada que já está fornecendo um modelo de exibição pronto para seu próprio vínculo de dados. Você vê essa técnica em alguns exemplos do SDK: <common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">

Observação  O uso de XAML para RelativeSource mostra apenas o uso pretendido: definir um valor para Binding.RelativeSource em XAML como parte de uma expressão de ligação. Teoricamente, outros usos são possíveis no caso da definição de uma propriedade na qual o valor é RelativeSource.

Tópicos relacionados

Visão geral do XAML
Visão geral de vinculação de dados
Binding markup extension
Binding
RelativeSource

 

 

Mostrar:
© 2014 Microsoft