Compartir a través de


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 de atributos XAML

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

Uso de atributos XAML (para la propiedad 'Setter' en plantilla o estilo)

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

Valores XAML

Término Description
propertyName Nombre de la propiedad que se establece en la sintaxis del configurador. Debe ser una propiedad de dependencia.
propiedadDeOrigen Nombre de otra propiedad de dependencia que existe en el tipo que está siendo plantillado.

Observaciones

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 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 composición, que se usa para mostrar la propiedad de texto Text del control, podría incluir este XAML como parte de la plantilla del 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 elemento primario con plantilla también se aplaza mediante 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 normalmente se implementan cuando hay un requisito de escape de valores de atributo que no sean valores literales o nombres de controlador, y el requisito es más global que simplemente colocar 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 Código adaptable de versión.

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. El TargetType en el ControlTemplate actúa como el origen de datos y logra el mismo resultado que un TemplateBinding al elemento padre.

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