Extensión de marcado {TemplateBinding}

Vincula el valor de una propiedad de una plantilla de control al valor de alguna 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 de atributos XAML (para la propiedad Setter en plantilla o estilo)

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

Valores de XAML

Término Descripción
propertyName Nombre de la propiedad que se establece en la sintaxis de establecedor. Debe ser una propiedad de dependencia.
sourceProperty Nombre de otra propiedad de dependencia que existe en el tipo que se está creando una plantilla.

Comentarios

El uso de TemplateBinding es una parte fundamental de cómo definir una plantilla de control, ya sea si es un autor de control personalizado o si va a reemplazar 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 e intuitivamente denominada de una de sus partes componentes. Por ejemplo, un control que incorpora un TextBlock en su redacción, que se usa para mostrar la 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 hay ninguna oportunidad de introducir un convertidor cuando se usa TemplateBinding. Si no se coinciden los valores, se produce un error al analizar el XAML. Si necesita un convertidor, puede usar la sintaxis detallada para un enlace de plantilla como: {Binding RelativeSource={RelativeSource TemplatedParent}, Converter="..." ...}

Si se intenta usar TemplateBinding fuera de una definición controlTemplate en XAML, se producirá un error del analizador.

Puede usar TemplateBinding para los casos en los que el valor primario con plantilla también se aplaza como otro enlace. La evaluación de TemplateBinding puede esperar hasta que los enlaces en tiempo de ejecución necesarios tengan valores.

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 por la que 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 el marcado XAML. No hay una manera sencilla de reproducir el comportamiento en el código.

x:Bind en ControlTemplate

Nota:

El uso de x:Bind en 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, puedes usar la extensión de marcado x:Bind en cualquier lugar en el que uses TemplateBinding en controlTemplate.

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

Con la compatibilidad con x:Bind, puede usar tanto enlaces de función como enlaces bidireccionales en 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>