¿Qué es la unión de la plantilla frente a la unión?

118

No pude entender BorderThickness="{TemplateBinding BorderThickness}. Aquí el código:

<ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}">
    <Border Padding="{TemplateBinding Padding}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
</ControlTemplate>

También explique otros tipos de encuadernación.

prjndhi
fuente
por qué esta devolución y por qué BorderThickness escribe dos veces "" "BorderThickness =" {TemplateBinding BorderThickness} "" "
prjndhi
1
@Euphoric, esta página parece ser el primer resultado de Google para esa consulta. ;)
ANeves

Respuestas:

204

TemplateBinding se utiliza para vincular las propiedades del elemento dentro de la definición de la plantilla. En su ejemplo, podría haber escrito

 <Border Padding="{Binding Padding}" ...>

lo que significa unir la propiedad de relleno del borde a la propiedad de relleno de ... ¿qué? Le gustaría decir "propiedad de relleno del control para el que se utiliza esta plantilla". No puede darle un nombre porque no conoce el x: Nombre del control en este momento (incluso si lo supiera, no funcionaría porque está en un ámbito de nombres diferente). Sin embargo, puede hacer esto definiendo una fuente relativa

<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>

o use TemplateBinding que es un atajo (*) para arriba

<Border Padding="{TemplateBinding Padding}" ...>

(*) Además de ser menos detallado en estos escenarios de plantillas, TemplateBinding tiene un par de diferencias en comparación con un enlace normal:

  • Se evalúa en tiempo de compilación. (Si, por ejemplo, la propiedad Padding no existiera, obtendría un error de compilación. Pero si usara un enlace con TemplatedParent, solo vería el error en tiempo de ejecución).
  • Siempre es un enlace unidireccional.
  • Requiere que tanto las propiedades de origen como de destino sean propiedades de dependencia .
  • Tiene mucha menos funcionalidad (sin StringFormat, Delay, IsAsync, etc. vea las propiedades de Binding vs TemplateBindingExtention ).
Eren Ersönmez
fuente
58

Una imagen vale mas que mil palabras. En este caso es un video de 7 minutos: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDITAR: Ejemplo:

  • Una Buttontiene un valor predeterminado ControlTemplatepropiedad y Heightla propiedad
  • Anula la ControlTemplatepropiedad de a Buttonescribiendo la suya propia (por ejemplo, desea crear un Ellipsebotón -looking en lugar de Rectangle-looking)
  • Después de crear un Ellipsenuevo ControlTemplate, desea Ellipseque sea del mismo tamaño que la Heightpropiedad del botón original
  • Por lo que utilizar TemplateBindingcon el fin de referencia Buttonque está Heightsin nombrarloingrese la descripción de la imagen aquí
Malo
fuente
Si bien esto puede responder teóricamente a la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia.
Bhargav Rao
32

Eren Ersönmenz ya lo explicó bastante bien, pero me gustaría darle otra perspectiva para entender mejor el concepto.

En WPF, cada control está más o menos separado de su presentación. Siempre puede cambiar la plantilla de controles y hacer que se vea completamente diferente. Un botón funciona como se esperaba con un ControlTemplatesolo que consta de, Rectanglepor ejemplo. Ahora bien, a veces es necesario ControlTemplateque realmente utilice las propiedades de la parte lógica de un control. Y para eso TemplateBindinges que solo le dice al ControlTemplate"Use esta propiedad del control que le estamos dando a la presentación visual". Un buen ejemplo es la Backgroundpropiedad en cada control, no tiene significado por sí misma, obtiene su significado TemplateBindingal control secundario en elControlTemplate .

El enlace por sí solo se describe muy bien en el MSDN . Esta es una hoja de trucos muy bonita que de hecho cuelga de mi pared junto a mí. Ofrece una buena descripción de todos los enlaces disponibles.

dowhilefor
fuente
6

Desde TemplateBinding Markup Extension , TemplateBindingvincula el valor de una propiedad en una plantilla de control al valor de alguna otra propiedad expuesta en el control con plantilla. En otras palabras, es para vincular valores en una plantilla.

El enlace conecta una propiedad de los destinos de enlace y las fuentes de datos.

Zabavsky
fuente