Partilhar via


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 modelado. TemplateBinding só pode ser usado dentro de uma definição ControlTemplate em XAML.

Uso de atributos XAML

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

Uso do atributo XAML (para a propriedade Setter num modelo ou estilo)

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

Valores XAML

Term Description
propertyName O nome da propriedade que está sendo definida na sintaxe do setter. Esta deve ser uma propriedade de dependência.
fontePropriedade O nome de outra propriedade de dependência que existe no tipo que está sendo modelado.

Observações

Usar 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 para controles existentes. Para saber mais, veja 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 propriedade Text do próprio controle, pode incluir esse XAML como parte no modelo de controle: <TextBlock Text="{TemplateBinding Text}" .... />

Os tipos usados como o valor para a propriedade de origem e a propriedade de destino devem corresponder. Não há oportunidade de introduzir um conversor quando você estiver usando TemplateBinding. A falha na correspondência de valores resulta em um erro ao analisar o XAML. Se você precisar de um conversor, você pode usar a sintaxe detalhada para uma vinculação de modelo, como: {Binding RelativeSource={RelativeSource TemplatedParent}, Converter="..." ...}

Tentar usar um TemplateBinding fora de uma definição 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 ligação. A avaliação para TemplateBinding pode esperar até que qualquer ligação de runtime necessária tenha valores.

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

TemplateBinding é uma extensão de marcação. As extensões de marcação geralmente são implementadas quando há a necessidade de fugir de valores de atributos diferentes de valores literais ou nomes de funções manipuladoras, e a necessidade é mais abrangente do que apenas colocar conversores de tipos em determinados 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 Windows Runtime, não existe uma representação de classe de apoio para TemplateBinding. TemplateBinding é exclusivamente para uso em marcação XAML. Não há uma maneira simples de reproduzir o comportamento no código.

x:Vincular no Modelo de Controlo

Observação

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

A partir do Windows 10, versão 1809, pode-se usar a extensão de marcação x:Bind em qualquer lugar que se use TemplateBinding num ControlTemplate.

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

Com o suporte a x:Bind, pode-se usar tanto associações de função 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 pai.

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