Pergunta

O que é o diferença entre estes 2 ligações:

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{TemplateBinding Property=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

e

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

?

Foi útil?

Solução

TemplateBinding não é bem a mesma coisa. docs MSDN muitas vezes são escritos por pessoas que têm de questionário SDEs monossilábicas sobre recursos de software, de modo que as nuances não estão muito bem.

TemplateBindings são avaliadas em tempo de compilação contra o tipo especificado no modelo de controle. Isto permite a instanciação muito mais rápido de modelos compilados. Apenas atrapalhar o nome em um TemplateBinding e você verá que a vontade bandeira compilador-lo.

A marcação de ligação é resolvido em tempo de execução. Embora mais lento para executar, a ligação irá resolver nomes de propriedades que não são visíveis no tipo declarado pelo modelo. Por mais lento, eu vou salientar que o seu tipo de relação desde que a operação de ligação leva muito pouco da CPU do aplicativo. Se você fosse explodir modelos de controle em torno de alta velocidade que você pode notar.

Por uma questão de utilização prática do TemplateBinding quando você pode, mas não temem a ligação.

Outras dicas

TemplateBinding - Mais limitante do que usando regulares Encadernação

  • Mais eficiente do que uma ligação, mas tem menos funcionalidade
  • Só funciona dentro de um ControlTemplate árvore visual
  • não funciona com propriedades em Freezables
  • não funciona dentro do disparador de um ControlTemplate
  • Fornece um atalho na definição de propriedades (não tão detalhado), por exemplo. {TemplateBinding TargetProperty}

regular Encadernação - não tem acima das limitações de TemplateBinding

  • Propriedades Respeita Pais
  • Valores Repõe-alvo para limpar quaisquer valores explicitamente definidos
  • Exemplo:

Só mais uma coisa - TemplateBindings não permitem valor de conversão. Eles não permitem que você passe um conversor e não converter automaticamente int para string por exemplo (o que é normal para um Binding).

TemplateBinding é um atalho para a ligação com TemplatedParent mas não expõe todas as capacidades da classe Binding, por exemplo, você não pode controlar Binding.Mode de TemplateBinding.

RelativeSource TemplatedParent

Este modo permite amarrar uma determinada propriedade ControlTemplate para uma propriedade do controle que o ControlTemplate é aplicada. Para bem compreender a questão aqui é um exemplo abaixo

<Window.Resources>
    <ControlTemplate x:Key="template">
        <Canvas>
            <Canvas.RenderTransform>
                <RotateTransform Angle="20"/>
            </Canvas.RenderTransform>
            <Ellipse Height="100" Width="150" 
                     Fill="{Binding 
                RelativeSource={RelativeSource TemplatedParent},
                Path=Background}">

            </Ellipse>
            <ContentPresenter Margin="35" 
                      Content="{Binding RelativeSource={RelativeSource  
                      TemplatedParent},Path=Content}"/>
        </Canvas>
    </ControlTemplate>
</Window.Resources>

<Canvas Name="Parent0">
    <Button   Margin="50" 
              Template="{StaticResource template}" Height="0" 
              Canvas.Left="0" Canvas.Top="0" Width="0">
        <TextBlock FontSize="22">Click me</TextBlock>
    </Button>
</Canvas>

Se eu quiser aplicar as propriedades de um determinado controle ao seu modelo de controle, então eu posso usar o modo TemplatedParent. Há também uma semelhante a esta extensão de marcação que é o TemplateBinding que é um tipo de mão curta do primeiro, mas o TemplateBinding é avaliada em tempo de compilação com o contraste do TemplatedParent que é avaliada logo após o primeiro tempo de execução. Como você pode observar na figura abaixo, o fundo eo conteúdo são aplicadas a partir de dentro o botão para o modelo de controle.

Eu pensei que TemplateBinding não suporta tipos de Freezable (que inclui objetos 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 TemplateBinding: http://msdn.microsoft.com/en-us/library/ms742882. aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top