WPF TemplateBinding vs RelativeSource TemplatedParent


169

Qual è la differenza tra questi 2 attacchi:

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

?


17
se hai bisogno di TwoWay Binding, devi usare la seconda opzione
Joachim Kerschbaumer,

Risposte:


207

TemplateBinding non è esattamente la stessa cosa. I documenti MSDN sono spesso scritti da persone che devono interrogare SDE monosillabiche sulle funzionalità del software, quindi le sfumature non sono del tutto esatte.

TemplateBindings vengono valutati in fase di compilazione rispetto al tipo specificato nel modello di controllo. Ciò consente un'istanza molto più rapida dei modelli compilati. Basta armeggiare il nome in un templatebinding e vedrai che il compilatore lo contrassegnerà.

Il markup di associazione viene risolto in fase di esecuzione. Mentre l'esecuzione è più lenta, l'associazione risolverà i nomi delle proprietà che non sono visibili sul tipo dichiarato dal modello. Più lentamente, farò notare che il suo tipo di parente poiché l'operazione di associazione richiede pochissimo della CPU dell'applicazione. Se facessi saltare modelli di controllo ad alta velocità, potresti notarlo.

In pratica, usa TemplateBinding quando puoi ma non temere il Binding.


18
Quindi i principali pensano di ricordare: tempo di compilazione vs runtime. TemplateBinding non funzionerà se provi a modificarlo durante il runtime. Giusto ?
PaN1C_Showt1Me

3
Si noti inoltre che l'utilizzo di Binding anziché TemplateBinding può avere implicazioni su ciò che si vede in fase di progettazione. In alcune configurazioni, le proprietà associate a {Binding RelativeSource ...} non verranno visualizzate nella finestra di progettazione (sebbene vengano comunque visualizzate in fase di esecuzione), ma se si passa a utilizzare {TemplateBinding ...} tali proprietà vengono valutate durante la fase di progettazione.
lfalin,

Una cosa che aggiungerò nel caso in cui aiuti i visitatori futuri è che poiché TemplateBinding viene valutato in fase di compilazione, non è possibile utilizzare TemplateBinding per associare una proprietà collegata definita dall'utente. Nel caso di proprietà associate definite dall'utente, è necessario utilizzare "{Binding RelativeSource = {RelativeSource TemplatedParent} ...}"
MNB il

35

TemplateBinding - Più limitante rispetto all'utilizzo del Binding normale

  • Più efficiente di un Binding ma ha meno funzionalità
  • Funziona solo all'interno dell'albero visivo di ControlTemplate
  • Non funziona con le proprietà su Freezables
  • Non funziona con il trigger di ControlTemplate
  • Fornisce una scorciatoia per l'impostazione delle proprietà (non come dettagliata), ad esempio {TemplateBinding targetProperty}

Rilegatura regolare : non presenta le limitazioni sopra riportate di TemplateBinding

  • Rispetta le proprietà dei genitori
  • Reimposta i valori target per cancellare eventuali valori impostati in modo esplicito
  • Esempio: <Ellipse Fill = "{Binding RelativeSource = {RelativeSource TemplatedParent}, Path = Background}" />

22

Ancora una cosa: TemplateBindings non consente la conversione di valore. Non consentono di passare un convertitore e non convertono automaticamente int in stringa, ad esempio (cosa normale per un Binding).


1
Grazie Miroslav, questo era il problema che stavo riscontrando, passando all'utilizzo di TemplatedParent ha risolto il problema.
MikeKulls

17

TemplateBinding è una scorciatoia per Binding con TemplatedParent ma non espone tutte le funzionalità della classe Binding, ad esempio non è possibile controllare Binding.Mode da TemplateBinding.


1

Ho pensato che TemplateBinding non supporta i tipi Freezable (che include oggetti pennello). Per aggirare il problema. Si può fare uso di TemplatedParent


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.