mvvmlight galasoft wpf mvvm-light

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 propiedad ControlTemplate predeterminada y una propiedad Height
  • Usted anula la propiedad ControlTemplate de un Button escribiendo el suyo propio (por ejemplo, quiere hacer un botón Ellipse mira en lugar de Rectangle -looking)
  • Después de que haya creado una Ellipse en su nuevo ControlTemplate , desea que el Ellipse tenga el mismo tamaño que la propiedad Height del botón original.
  • Entonces usa TemplateBinding para hacer referencia a Height Button sin nombrarlo