Extensão de marcação {TemplateBinding}

Vincula o valor de uma propriedade em um modelo de controle ao valor de outra propriedade exposta no controle modelo. TemplateBinding só pode ser usado em uma definição ControlTemplate em XAML.

Uso do atributo XAML

<object propertyName="{TemplateBinding sourceProperty}" .../>

Uso de atributo XAML (para a propriedade Setter em um modelo ou estilo)

<Setter Property="propertyName" Value="{TemplateBinding sourceProperty}" .../>

Valores XAML

Termo Descrição
propertyName O nome da propriedade que está sendo definida na sintaxe de setter. Deve ser uma propriedade de dependência.
sourceProperty O nome de outra propriedade de dependência existente no tipo que está sendo modelado.

Comentários

O uso de TemplateBinding é uma parte fundamental de como definir um modelo de controle, seja você um autor de controle personalizado ou esteja substituindo um modelo de controle para controles existentes. Para obter mais informações, consulte Guia de início rápido: modelos de controle.

É muito comum que propertyName e targetProperty usem o mesmo nome de propriedade. Nesse caso, um controle pode definir uma propriedade em si próprio e encaminhá-la para uma propriedade existente, com nome intuitivo, de uma de suas partes componentes. Por exemplo, um controle que incorpora um TextBlock em sua composição, que é usada para exibir a própria propriedade Text do controle, pode incluir esse XAML como parte no modelo de controle: <TextBlock Text="{TemplateBinding Text}" .... />

Os tipos usados como o valor para propriedade de origem e a propriedade de destino devem corresponder. Não há oportunidade de introduzir um conversor quando estiver usando TemplateBinding. Caso os valores não correspondam, isso resulta em um erro ao analisar o XAML. Se você precisar de um conversor, poderá usar a sintaxe detalhada para uma associação de modelo, como: {Binding RelativeSource={RelativeSource TemplatedParent}, Converter="..." ...}

A tentativa de usar um TemplateBinding fora de uma definição ControlTemplate em XAML resultará em erro do analisador.

Você pode usar TemplateBinding para casos em que o valor pai do modelo também está adiado como outra associação. A avaliação para TemplateBinding pode aguardar até que as associações do tempo de execução necessárias tenham valores.

Um TemplateBinding é sempre uma associação de uma via. Ambas as propriedades envolvidas devem ser propriedades de dependência.

TemplateBinding é uma extensão de 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, sendo esta a convenção pela qual um processador XAML reconhece que uma extensão de marcação deve processar o atributo.

Nota Na implementação do processador XAML Windows Runtime, não há representação de classe de suporte para TemplateBinding. TemplateBinding é de uso exclusivo na marcação XAML. Não existe uma maneira simples de reproduzir o comportamento em código.

x:Bind em ControlTemplate

Observação

Usar x:Bind em um ControlTemplate requer Windows 10, versão 1809 (SDK 17763) ou posterior. Para saber mais sobre as versões de destino, consulte Código adaptável de versão.

Começando com Windows 10, versão 1809, você pode usar a extensão de marcação x:Bind em qualquer lugar em que usar TemplateBinding em um ControlTemplate.

A propriedade TargetType é necessária (não opcional) em ControlTemplate ao usar x:Bind.

Com o suporte a x:Bind , você pode usar associações de função , bem como associações bidirecionais em um ControlTemplate.

Neste exemplo, a propriedade TextBlock.Text é avaliada como Button.Content.ToString. O TargetType no ControlTemplate atua como a fonte de dados e realiza o mesmo resultado que um TemplateBinding para pai.

<ControlTemplate TargetType="Button">
    <Grid>
        <TextBlock Text="{x:Bind Content, Mode=OneWay}"/>
    </Grid>
</ControlTemplate>