Qual è l'associazione del modello rispetto alla rilegatura?


118

Non riuscivo a capire BorderThickness="{TemplateBinding BorderThickness}. Qui il codice:

<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>

Spiega anche altri tipi di rilegatura.


perché questo ritorno e perché BorderThickness scrive due volte "" "BorderThickness =" {TemplateBinding BorderThickness} "" "
prjndhi

1
@Euphoric questa pagina sembra essere il primo risultato di Google per quella query. ;)
ANeves

Risposte:


204

TemplateBinding viene utilizzato per il collegamento alle proprietà dell'elemento all'interno della definizione del modello. Nel tuo esempio, avresti potuto scrivere

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

che significa associare la proprietà di riempimento del bordo alla proprietà di riempimento di ... cosa? Vorresti dire "proprietà di riempimento del controllo per cui viene utilizzato questo modello". Non puoi dargli un nome perché non conosci la x: Nome del controllo in questo momento (anche se lo facessi, non funzionerebbe perché è in un ambito dei nomi diverso). Tuttavia, puoi farlo definendo una fonte relativa

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

o usa TemplateBinding che è una scorciatoia (*) per sopra

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

(*) Oltre ad essere meno prolisso in questi scenari di modelli, TemplateBinding presenta un paio di differenze rispetto a un binding regolare:

  • Viene valutato in fase di compilazione. (se, ad esempio, la proprietà Padding non esistesse, si otterrebbe un errore di compilazione. Ma se si utilizzasse un'associazione con TemplatedParent, verrà visualizzato l'errore solo in fase di esecuzione.)
  • È sempre un legame unidirezionale.
  • Richiede che entrambe le proprietà di origine e di destinazione siano proprietà di dipendenza .
  • Ha molte meno funzionalità (niente StringFormat, Delay, IsAsync, ecc. Vedere le proprietà di Binding vs TemplateBindingExtention ).

58

Un'immagine vale più di mille parole. In questo caso è un video di 7 minuti: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDIT: Esempio:

  • Una Buttonha un valore predefinito ControlTemplatedi proprietà e Heightimmobili
  • Si sovrascrive la ControlTemplateproprietà di a Buttonscrivendone uno personalizzato (ad esempio, si desidera creare un Ellipsepulsante dall'aspetto anziché Rectangledall'aspetto)
  • Dopo aver creato un Ellipsenuovo ControlTemplate, si desidera Ellipseche abbia le stesse dimensioni della Heightproprietà Button originale
  • Quindi si usa TemplateBindingper fare riferimento a Button's Heightsenza nominarloinserisci qui la descrizione dell'immagine

Sebbene questo possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento per riferimento.
Bhargav Rao

32

Eren Ersönmenz lo ha già spiegato abbastanza bene, ma vorrei dargli un'altra prospettiva per capire meglio il concetto.

In WPF ogni controllo è più o meno distaccato dalla sua presentazione. Puoi sempre modificare il modello dei controlli e renderlo completamente diverso. Un pulsante funziona come previsto con un ControlTemplatesolo composto da un, Rectanglead esempio. Ora a volte è necessario ControlTemplateutilizzare effettivamente le proprietà della parte logica di un controllo. E questo TemplateBindingè ciò che dice semplicemente ControlTemplate"Usa questa proprietà del controllo che stiamo dando alla presentazione visiva". Un buon esempio è la Backgroundproprietà su ogni controllo, non ha significato di per sé, ottiene il suo significato da TemplateBindingessa per il controllo figlio in ControlTemplate.

Il binding da solo è descritto molto bene in MSDN . Questo è un simpatico foglietto che in effetti è appeso al muro proprio accanto a me. Fornisce una buona panoramica di tutti i diversi attacchi disponibili.


6

Da TemplateBinding Markup Extension , TemplateBindingcollega il valore di una proprietà in un modello di controllo al valore di qualche altra proprietà esposta sul controllo basato su modelli. In altre parole, serve per associare i valori in un modello.

Binding collega una proprietà di destinazioni di binding e origini dati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.