Extensão de marcação {TemplateBinding}
Vincula o valor de uma propriedade em um modelo de controle ao valor de alguma outra propriedade exposta no controle modelo. TemplateBinding só pode ser usado em uma definição de ControlTemplate em XAML.
Uso do atributo XAML
<object propertyName="{TemplateBinding sourceProperty}" .../>
Uso de atributo XAML (para a propriedade Setter no 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 do setter. Isso deve ser uma propriedade de dependência. |
propriedade de origem | O nome de outra propriedade de dependência que existe no tipo que está sendo modelado. |
Comentários
O uso de TemplateBinding é uma parte fundamental de como você define um modelo de controle, se você for um autor de controle personalizado ou se estiver substituindo um modelo de controle por controles existentes. Para obter mais informações, consulte Guia de início rápido: modelos de controle.
É bastante comum que propertyName e targetProperty usem o mesmo nome de propriedade. Nesse caso, um controle pode definir uma propriedade em si mesmo e encaminhar a propriedade para uma propriedade existente e intuitivamente nomeada de uma de suas partes componentes. Por exemplo, um controle que incorpora um TextBlock em sua composição, que é usado para exibir a própria propriedade Text do controle, pode incluir esse XAML como parte do modelo de controle:<TextBlock Text="{TemplateBinding Text}" .... />
Os tipos usados como o valor da propriedade de origem e da propriedade de destino devem corresponder. Não há oportunidade de introduzir um conversor quando você estiver usando TemplateBinding. A falha ao corresponder os valores 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 de ControlTemplate em XAML resultará em um erro de analisador.
Você pode usar TemplateBinding para casos em que o valor pai do modelo também é adiado como outra associação. A avaliação de TemplateBinding pode aguardar até que todas as associações de runtime necessárias tenham valores.
Um TemplateBinding é sempre uma associação unidirecional. 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 "}" em sua sintaxe de atributo, que é a convenção pela qual um processador XAML reconhece que uma extensão de marcação deve processar o atributo.
Observação Na implementação do processador XAML do Tempo de Execução do Windows, não há representação de classe de suporte para TemplateBinding. TemplateBinding é exclusivamente para uso na marcação XAML. Não há uma maneira direta de reproduzir o comportamento no código.
x:Bind em ControlTemplate
Observação
O uso de 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.
A partir do Windows 10, versão 1809, você pode usar a extensão de marcação x:Bind em qualquer lugar em que use 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 obtém o mesmo resultado que um TemplateBinding para o pai.
<ControlTemplate TargetType="Button">
<Grid>
<TextBlock Text="{x:Bind Content, Mode=OneWay}"/>
</Grid>
</ControlTemplate>