Extensión de marcado {TemplateBinding}

Vincula el valor de una propiedad en una plantilla de control al valor de otra propiedad expuesta en el control con plantilla. TemplateBinding solo se puede usar dentro de una definición ControlTemplate en XAML.

Uso del atributo XAML

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

Uso del atributo XAML (para la propiedad Setter en la plantilla o estilo)

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

Valores de XAML

Término Descripción
propertyName El nombre de la propiedad que se establece en la sintaxis de setter. Debe ser una propiedad de dependencia.
sourceProperty El nombre de otra propiedad de dependencia que existe en el tipo al que se aplica la plantilla.

Comentarios

El uso de TemplateBinding es una parte fundamental de la definición de una plantilla de control, tanto si eres un autor de control personalizado como si reemplazas una plantilla de control para los controles existentes. Para obtener más información, consulta Inicio rápido: plantillas de control.

Es bastante común que propertyName y targetProperty usen el mismo nombre de propiedad. En este caso, un control podría definir una propiedad en sí misma y reenviar la propiedad a una propiedad existente y con un nombre asignado intuitivamente de una de sus partes componentes. Por ejemplo, un control que incorpora un TextBlock en su redacción, que se usa para mostrar la propia propiedad Text del control, podría incluir este XAML como parte de la plantilla de control: <TextBlock Text="{TemplateBinding Text}" .... />

Los tipos usados como valor para la propiedad de origen y la propiedad de destino deben coincidir. No existe la posibilidad de introducir un convertidor al usar TemplateBinding. Si no coinciden los valores, se produce un error al analizar el XAML. Si necesitas un convertidor, puedes usar la sintaxis detallada para un enlace de plantillas como: {Binding RelativeSource={RelativeSource TemplatedParent}, Converter="..." ...}

Al intentar usar un TemplateBinding fuera de una definición de ControlTemplate en XAML se generará un error del analizador.

Puedes usar TemplateBinding en casos en los que el valor principal de la plantilla también se aplace como otro enlace. La evaluación de TemplateBinding no puede esperar que algún enlace necesario en tiempo de ejecución tenga valores.

Un TemplateBinding siempre es un enlace unidireccional. Ambas propiedades implicadas deben ser propiedades de dependencia.

TemplateBinding es una extensión de marcado. Las extensiones de marcado se suelen implementar cuando se necesita que los valores de los atributos de escape no sean valores literales o nombres de controladores, y este requisito es de índole más global que limitarse a colocar los convertidores de tipos en determinados tipos o propiedades. Todas las extensiones de marcado en XAML usan los caracteres "{" y "}" en su sintaxis de atributo, que es la convención mediante la cual un procesador XAML reconoce que una extensión de marcado debe procesar el atributo.

Nota En la implementación del procesador XAML de Windows Runtime, no hay ninguna representación de clase de respaldo para TemplateBinding. TemplateBinding se usa exclusivamente en marcado XAML. No hay una forma directa de reproducir el comportamiento en el código.

x:Bind en ControlTemplate

Nota:

El uso de x:Bind en un ControlTemplate requiere Windows 10, versión 1809 (SDK 17763) o posterior. Para obtener más información sobre las versiones de destino, consulta Version adaptive code (Código adaptativo para versiones).

A partir de Windows 10, versión 1809, puede usar la extensión de marcado x:Bind en cualquier lugar en el que use TemplateBinding en una clase ControlTemplate.

La propiedad TargetType es necesaria (no opcional) en ControlTemplate al usar x:Bind.

Con la compatibilidad con x:Bind , puede usar ambos enlaces de función , así como enlaces bidireccionales en una clase ControlTemplate.

En este ejemplo, la propiedad TextBlock.Text se evalúa como Button.Content.ToString. TargetType en controlTemplate actúa como origen de datos y logra el mismo resultado que templateBinding para el elemento primario.

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