Domanda

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>

È stato utile?

Soluzione

TemplateBinding non è proprio la stessa cosa. documentazione MSDN sono spesso scritti da persone che hanno a quiz SDE monosillabiche circa le caratteristiche del software, quindi le sfumature non sono abbastanza di destra.

TemplateBindings sono valutati al momento della compilazione contro il tipo specificato nel modello di controllo. Questo permette molto più veloce istanza di template compilati. Basta armeggiare il nome in una TemplateBinding e vedrete che la volontà flag di compilazione di esso.

Il codice vincolante è risolto in fase di esecuzione. Mentre più lento da eseguire, il legame risolverà nomi di proprietà che non sono visibili sul tipo dichiarato dal modello. Con più lento, io sottolineare che questo tipo di relativa in quanto l'operazione di legame richiede pochissimo della CPU dell'applicazione. Se stavate distruggendo le modelli di controllo attorno ad alta velocità si potrebbe notare esso.

È un dato di pratica usare il TemplateBinding quando si può, ma non temere l'Binding.

Altri suggerimenti

TemplateBinding - più limitante rispetto all'uso normale Binding

  • più efficiente di una rilegatura ma ha meno funzionalità
  • Funziona solo all'interno albero visuale di un oggetto ControlTemplate
  • Non funziona con proprietà sul Freezables
  • Non funziona all'interno di trigger di un ControlTemplate
  • Fornisce un collegamento nella impostazione delle proprietà (non come verbose), per es. {TemplateBinding targetProperty}

regolare Binding - non ha limitazioni di cui sopra TemplateBinding

  • Rispetta Proprietà Parent
  • Valori Ripristina target per cancellare i valori esplicitamente impostati
  • Esempio:

Una cosa di più - TemplateBindings non permettono il valore di conversione. Essi non consentono di passare un convertitore e non convertire automaticamente int a string per esempio (che è normale per un Binding).

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

RelativeSource TemplatedParent

Questa modalità permette di legare una data proprietà ControlTemplate a una proprietà del controllo che ControlTemplate viene applicato. Per capire bene il problema qui è un esempio muggito

<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 dato di controllo per il suo modello di controllo allora posso utilizzare la modalità TemplatedParent. C'è anche una analoga a questa estensione di markup che è la TemplateBinding che è una sorta di mano corta della prima, ma il TemplateBinding viene valutata al momento della compilazione del contrasto del TemplatedParent che viene valutata solo dopo la prima fase di esecuzione. Come si può osservare nella figura qui sotto, lo sfondo e il contenuto vengono applicate all'interno del pulsante per il modello di controllo.

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

Sono usati in modo simile ma hanno alcune differenze. Questo è il link alla documentazione TemplateBinding: http://msdn.microsoft.com/en-us/library/ms742882. aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top