2012-05-15 13 views
86

No pude entender BorderThickness="{TemplateBinding BorderThickness}. Aquí el código:¿Cuál es el enlace de la plantilla frente a la vinculación?

<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 por favor explicar otros tipos de unión.

+0

qué este retorno y por qué BorderThickness escribe dos veces "" "BorderThickness =" {TemplateBinding BorderThickness} "" " – prjndhi

+0

@Eurético esta página parece ser el primer resultado de google para esa consulta. ;) – ANeves

Respuesta

151

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

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

sentido a unirse propiedad padding de la frontera a la propiedad padding 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, puede hacer esto mediante la definición de una fuente relativa

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

o utilizar TemplateBinding que es un acceso directo (*) 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 una manera vinculante.
  • 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 contra TemplateBindingExtention).
5

De TemplateBinding Markup Extension, TemplateBinding enlaces el valor de una propiedad en una plantilla de control al 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 orígenes de datos.

29

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 desligado 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 que solo consiste en un Rectangle por ejemplo. Ahora, algunas veces es necesario que el ControlTemplate realmente use las propiedades de la parte lógica de un control. Y eso es lo que TemplateBinding es para él solo le dice al ControlTemplate "Usar esta propiedad del control que estamos dando a la presentación visual". Un buen ejemplo es la propiedad Background en cada control, no tiene significado en sí mismo, obtiene su significado por TemplateBinding en control infantil en el ControlTemplate.

Encuadernación en sí mismo es muy bueno, se describe en el 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.

27

Una imagen vale más que 1000 palabras. En este caso se trata de 7 minutos de vídeo: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDIT: Ejemplo:

  • Un Button tiene una propiedad predeterminada ControlTemplate y Height propiedad
  • Puede alterar temporalmente ControlTemplate propiedad de un Button escribiendo su propio (por ejemplo, desea hacer un botón que mira Ellipse en lugar de Rectangle -looking)
  • Una vez haya efectuado una Ellipse en su nueva ControlTemplate, desea que el Ellipse para ser del mismo tamaño que la propiedad del botón original de Height
  • por lo que utilizar TemplateBinding con el fin de hacer referencia a Button 's Height sin nombrarlo enter image description here
+0

Si bien esto puede responder teóricamente a la pregunta, [sería preferible] (// meta.stackoverflow.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace de referencia. –

+1

Gracias por la edición. Puedo votar ahora :-) –

+2

Gracias por la foto :) – Guillaume07

Cuestiones relacionadas