wpf - galasoft - mvvmcross
¿Cuál es el enlace de la plantilla frente a la unión? (4)
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.
Desde la extensión de marcado de vinculación de TemplateBinding
, vinculación de TemplateBinding
vincula el valor de una propiedad en una plantilla de control con el valor de alguna otra propiedad expuesta en el control de plantilla. En otras palabras, es para valores de enlace en una plantilla.
Binding conecta una propiedad de objetivos de enlace y fuentes de datos.
Eren Ersönmenz ya lo explicó bastante bien, pero me gustaría darle otra perspectiva para comprender 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 espera con un ControlTemplate
solo consiste en un Rectangle
por ejemplo. Ahora, a veces, es necesario que ControlTemplate
realmente use las propiedades de la parte lógica de un control. Y eso es lo que TemplateBinding
es solo le dice a ControlTemplate
"Use this property of the control we are giving the visual presentation". Un buen ejemplo es la propiedad Background
en cada control, no tiene significado en sí mismo, obtiene su significado mediante TemplateBinding
al control secundario en ControlTemplate
.
La vinculación en sí misma está muy bien descrita en MSDN . This es una muy buena hoja de trucos que, de hecho, cuelga en mi pared a mi lado. Proporciona una buena visión general de todos los diferentes enlaces disponibles.
TemplateBinding se usa para enlazar a las propiedades del elemento dentro de la definición de la plantilla. En tu ejemplo, podrías haber escrito
<Border Padding="{Binding Padding}" ...>
significa vincular 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 está utilizando esta plantilla". No puede darle un nombre porque no conoce la x: nombre del control en este momento (incluso si lo hizo, no funcionaría porque está en un namescope diferente). Sin embargo, puedes 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 regular:
- Se evalúa en tiempo de compilación. (si, por ejemplo, la propiedad de relleno no existiera, obtendría un error de compilación. Pero si utilizara un enlace con TemplatedParent, solo vería el error en tiempo de ejecución).
- Siempre es un enlace unidireccional.
- Requiere que las propiedades de origen y destino sean propiedades de dependencia .
- Tiene mucha menos funcionalidad (sin StringFormat, Delay, IsAsync, etc. vea las propiedades de Binding vs TemplateBindingExtention ).
Una imagen vale más que 1000 palabras. En este caso, es un video de 7 minutos: https://www.youtube.com/watch?v=z-0TZR-7xLI
EDITAR: Ejemplo:
- Un
Button
tiene una propiedadControlTemplate
predeterminada y una propiedadHeight
- Usted anula la propiedad
ControlTemplate
de unButton
escribiendo el suyo propio (por ejemplo, quiere hacer un botónEllipse
mira en lugar deRectangle
-looking) - Después de que haya creado una
Ellipse
en su nuevoControlTemplate
, desea que elEllipse
tenga el mismo tamaño que la propiedadHeight
del botón original. - Entonces usa
TemplateBinding
para hacer referencia aHeight
Button
sin nombrarlo