WPF TemplateBinding vs RelativeSource TemplatedParent

Qual é a diferença entre essas duas ligações:

     

e

      

?

TemplateBinding não é exatamente a mesma coisa. Os documentos do MSDN são geralmente escritos por pessoas que têm que questionar SDEs monossilábicos sobre resources de software, portanto, as nuances não estão corretas.

TemplateBindings são avaliados em tempo de compilation em relação ao tipo especificado no modelo de controle. Isso permite instanciação muito mais rápida de modelos compilados. Apenas fumble o nome em uma templatebinding e você verá que o compilador irá sinalizá-lo.

A marcação de binding é resolvida no tempo de execução. Embora mais lento para executar, a binding resolverá nomes de propriedades que não são visíveis no tipo declarado pelo modelo. Mais devagar, vou apontar que esse tipo de parente, já que a operação de binding demora muito pouco da CPU do aplicativo. Se você estivesse exibindo modelos de controle em alta velocidade, talvez perceba isso.

Por uma questão de prática, use o TemplateBinding quando você pode, mas não temer, o Binding.

TemplateBinding – Mais limitante do que usar o Binding regular

  • Mais eficiente do que uma binding, mas tem menos funcionalidade
  • Funciona somente dentro da tree visual de um ControlTemplate
  • Não funciona com propriedades no Freezables
  • Não funciona dentro do Trigger de um ControlTemplate
  • Fornece um atalho na definição de propriedades (não como verboso), por exemplo, {TemplateBinding targetProperty}

Ligação Regular – Não tem limitações acima de TemplateBinding

  • Respeita as propriedades pai
  • Redefine os Valores de Destino para limpar todos os valores definidos explicitamente
  • Exemplo:

Mais uma coisa – TemplateBindings não permitem converter valores. Eles não permitem que você passe um conversor e não converte automaticamente int para string, por exemplo (o que é normal para uma binding).

TemplateBinding é uma forma abreviada de Binding with TemplatedParent, mas não expõe todos os resources da class Binding, por exemplo, você não pode controlar Binding.Mode de TemplateBinding.

RelativeSource TemplatedParent

Esse modo permite vincular uma determinada propriedade ControlTemplate a uma propriedade do controle ao qual o ControlTemplate é aplicado. Para entender bem a questão aqui está um exemplo abaixo

                

Se eu quiser aplicar as propriedades de um determinado controle ao seu modelo de controle, posso usar o modo TemplatedParent. Há também um similar a esta extensão de marcação que é o TemplateBinding que é um tipo de ponteiro curto do primeiro, mas o TemplateBinding é avaliado em tempo de compilation no contraste do TemplatedParent que é avaliado logo após o primeiro tempo de execução. Como você pode observar na figura abaixo, o fundo e o conteúdo são aplicados de dentro do botão ao modelo de controle.

Eu pensei que TemplateBinding não suporta tipos Freezable (que inclui objects de pincel). Para contornar o problema. Pode-se fazer uso de TemplatedParent

Eles são usados ​​de forma semelhante, mas eles têm algumas diferenças. Aqui está um link para a documentação do TemplateBinding: http://msdn.microsoft.com/en-us/library/ms742882.aspx