¿Cuál es la diferencia entre estos 2 enlaces?
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="{TemplateBinding Property=Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
y
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
?
wpf
relativesource
templatebinding
PaN1C_Showt1Me
fuente
fuente
Respuestas:
TemplateBinding no es exactamente lo mismo. Los documentos de MSDN a menudo son escritos por personas que tienen que cuestionar SDE monosilábicas sobre las características del software, por lo que los matices no son del todo correctos.
TemplateBindings se evalúa en tiempo de compilación con respecto al tipo especificado en la plantilla de control. Esto permite una instanciación mucho más rápida de plantillas compiladas. Simplemente busque el nombre en un enlace de plantilla y verá que el compilador lo marcará.
El marcado vinculante se resuelve en tiempo de ejecución. Si bien es más lento de ejecutar, el enlace resolverá los nombres de propiedad que no son visibles en el tipo declarado por la plantilla. Más lentamente, señalaré que es un tipo de pariente ya que la operación de enlace toma muy poco de la CPU de la aplicación. Si estaba volando plantillas de control a gran velocidad, podría notarlo.
Como práctica, use TemplateBinding cuando pueda, pero no tema, a Binding.
fuente
Encuadernación de plantillas : más limitante que usar la encuadernación regular
Enlace regular : no tiene las limitaciones anteriores de TemplateBinding
fuente
Una cosa más: TemplateBindings no permite la conversión de valores. No le permiten pasar un convertidor y no convierten automáticamente int a string, por ejemplo (lo cual es normal para un enlace).
fuente
TemplateBinding es una forma abreviada de Binding con TemplatedParent, pero no expone todas las capacidades de la clase Binding, por ejemplo, no puede controlar Binding.Mode desde TemplateBinding.
fuente
Pensé que TemplateBinding no admite tipos Freezable (que incluye objetos de pincel). Para solucionar el problema. Uno puede hacer uso de TemplatedParent
fuente
Se usan de manera similar pero tienen algunas diferencias. Aquí hay un enlace a la documentación de TemplateBinding: http://msdn.microsoft.com/en-us/library/ms742882.aspx
fuente