WPF TemplateBinding vs RelativeSource TemplatedParent




(5)

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>

?


Pensavo che TemplateBinding non supporti i tipi Freezable (che include gli oggetti pennello). Per aggirare il problema. Si può fare uso di TemplatedParent


RelativeSource TemplatedParent

Questa modalità consente di associare una determinata proprietà ControlTemplate a una proprietà del controllo a cui è applicato ControlTemplate. Per capire bene il problema qui è un esempio qui sotto

<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 voglio applicare le proprietà di un determinato controllo al suo modello di controllo, allora posso usare la modalità TemplatedParent. C'è anche uno simile a questa estensione di markup che è il TemplateBinding che è una sorta di mano corta del primo, ma TemplateBinding viene valutato in fase di compilazione al contrasto del TemplatedParent che viene valutato subito dopo il primo tempo di esecuzione. Come si può notare nella figura a soffietto, lo sfondo e il contenuto vengono applicati dal pulsante al modello di controllo.


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


TemplateBinding non è esattamente la stessa cosa. I documenti MSDN sono spesso scritti da persone che devono interrogare le SDE monosillabiche sulle caratteristiche 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ù veloce dei modelli compilati. Solo fumble il nome in una templatebinding e vedrai che il compilatore lo contrassegnerà.

Il markup di associazione viene risolto in fase di runtime. Mentre è più lento da eseguire, il binding risolverà i nomi di proprietà che non sono visibili nel tipo dichiarato dal modello. Più lentamente, farò notare che il suo tipo di parente dato che l'operazione di binding prende pochissimo della CPU dell'applicazione. Se stavi esplodendo i modelli di controllo ad alta velocità potresti notarlo.

Come pratica, usa TemplateBinding quando puoi, ma non temere il binding.


TemplateBinding - Più limitante rispetto all'utilizzo di Binding regolare

  • 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 all'interno del trigger di ControlTemplate
  • Fornisce un collegamento nell'impostazione delle proprietà (non come dettagliato), ad esempio {TemplateBinding targetProperty}

Binding regolare: non ha limiti superiori di TemplateBinding

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




templatebinding