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.

prjndhi
fonte
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 ).
Eren Ersönmez
fonte
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
Ruim
fonte
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.

por enquanto
fonte
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.

Zabavsky
fonte