O que é a vinculação de modelo vs vinculação?


118

Eu não conseguia entender BorderThickness="{TemplateBinding BorderThickness}. Aqui está o 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>

Explique também outros tipos de vinculação.


por que esse retorno e por que BorderThickness escrever duas vezes "" "BorderThickness =" {TemplateBinding BorderThickness} "" "
prjndhi

1
@Euphoric, esta página parece ser o primeiro resultado do Google para essa consulta. ;)
ANeves de

Respostas:


204

TemplateBinding é usado para vincular as propriedades do elemento na definição do modelo. Em seu exemplo, você poderia ter escrito

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

que significa vincular a propriedade de preenchimento da fronteira à propriedade de preenchimento de ... o quê? Você gostaria de dizer, "propriedade de preenchimento do controle para o qual este modelo está sendo usado." Você não pode dar um nome a ele porque você não sabe o x: Nome do controle neste momento (mesmo se soubesse, não funcionaria porque está em um namescope diferente). No entanto, você pode fazer isso definindo uma fonte relativa

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

ou use TemplateBinding que é um atalho (*) para o acima

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

(*) Além de ser menos prolixo nesses cenários de modelagem, TemplateBinding tem algumas diferenças em comparação com uma vinculação regular:

  • Ele é avaliado em tempo de compilação. (se, por exemplo, a propriedade Padding não existisse, você obteria um erro de compilação. Mas se você fosse usar uma vinculação com TemplatedParent, só veria o erro em tempo de execução).
  • É sempre uma ligação unilateral.
  • Requer que as propriedades de origem e destino sejam propriedades de dependência .
  • Tem muito menos funcionalidade (sem StringFormat, Delay, IsAsync, etc. veja as propriedades de Binding vs TemplateBindingExtention ).

58

Uma imagem vale mais que mil palavras. Neste caso, é um vídeo de 7 minutos: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDITAR: Exemplo:

  • A Buttontem uma ControlTemplatepropriedade e Heightpropriedade padrão
  • Você substitui a ControlTemplatepropriedade de a Buttonescrevendo a sua própria (por exemplo, você deseja fazer um Ellipsebotão -looking em vez de Rectangle-looking)
  • Depois de criar um Ellipseem seu novo ControlTemplate, você deseja Ellipseque tenha o mesmo tamanho da Heightpropriedade original do Button
  • Então você usa TemplateBinding, a fim de referência Buttoné Heightsem nomeá-loinsira a descrição da imagem aqui

Embora isso possa teoricamente responder à pergunta, seria preferível incluir as partes essenciais da resposta aqui e fornecer o link para referência.
Bhargav Rao

32

Eren Ersönmenz já explicou muito bem, mas gostaria de dar uma outra perspectiva para entender melhor o conceito.

No WPF, cada controle é mais ou menos separado de sua apresentação. Você sempre pode alterar o modelo de controles e torná-los completamente diferentes. Um botão funciona conforme o esperado com um ControlTemplateconsistindo apenas em, Rectanglepor exemplo. Agora, às vezes é necessário que o ControlTemplateuse realmente as propriedades da parte lógica de um controle. E para isso TemplateBindingele apenas informa o ControlTemplate"Use esta propriedade do controle que estamos dando para a apresentação visual". Um bom exemplo é a Backgroundpropriedade em cada controle, ela não tem nenhum significado por si só, ela obtém seu significado por meio TemplateBindingdela para o controle filho noControlTemplate .

A vinculação por si só é muito boa descrita no MSDN . Esta é uma folha de cola muito bonita que na verdade está pendurada na minha parede ao meu lado. Ele oferece uma boa visão geral de todas as diferentes ligações disponíveis.


6

Em TemplateBinding Markup Extension , TemplateBindingvincula o valor de uma propriedade em um modelo de controle ao valor de alguma outra propriedade exposta no controle modelo. Em outras palavras, é para valores de ligação em um modelo.

Binding conecta uma propriedade de destinos de ligação e fontes de dados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.