WPF: dal DataBinding ai Template - Terza parte

5 pagine in totale: <<Indietro 1 2 3 [4] 5 Avanti >>

TemplateBinding nei controlli

Preservare la presentazione del contenuto di un controllo non è l'unico aspetto da prendere in considerazione quando si realizza un template che ne ridefinisce il layout, ma al fine di non annullare le possibilità di riutilizzo, dobbiamo inoltre mantenere il comportamento del maggior numero di proprietà.

Per chiarire quanto esposto, prendiamo ad esempio il seguente template:

<Style TargetType="{x:Type Button}"> 
  <Setter Property="Template"> 
    <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
        <Border Name="Border" Padding="15" CornerRadius="10"> 
          <Border.Background> 
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> 
              <GradientStop Color="Red" Offset="0.0" /> 
              <GradientStop Color="Black" Offset="1.0" /> 
            </LinearGradientBrush> 
          </Border.Background> 
          <ContentPresenter Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True"/> 
        </Border> 
      </ControlTemplate> 
    </Setter.Value> 
  </Setter> 
</Style> 

Questo template ricalca in parte quella predefinita per il tipo Button e assolve "egregiamente" lo scopo di abbellire lo sfondo del bottone. Poniamo che un giorno il gusto del nostro committente muti e sia necessario modificare lo sfondo di un unico e particolare bottone. Pensare di modificare il template non è una via percorribile visto che sarebbero coinvolti tutti i bottoni della nostra applicazione. Non sarebbe più agevole definire un'ulteriore template e se pensiamo a layout complessi, non al semplice Border del nostro esempio, la manutenzione dell'applicazione ne sarebbe compromessa o perlomeno complicata.

Non rimane altro che l'approccio più semplice che consiste nell'applicare una modifica localizzata sul controllo, definendo la proprietà inline mediante la Property Element Syntax.

<Button> 
  <Button.Background> 
    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> 
      <GradientStop Color="White" Offset="0.0" /> 
      <GradientStop Color="Black" Offset="1.0" /> 
    </LinearGradientBrush> 
  </Button.Background> Button 
</Button> 

Lanciamo l'applicazione e sono sufficienti pochi secondi per rimanere delusi: la nostra modifica non ha sortito nessun effetto. Il motivo per cui ogni nostro tentativo fallisce modificando lo sfondo mediante la proprietà definita dal tipo Button è da ricercare nel fatto che non esiste nessun collegamento tra la proprietà Background e il nostra template.

Al fine di ristabilire questo collegamento WPF mette a disposizione un meccanismo di Binding pensato espressamente per il template: il TemplateBinding. Modifichiamo quindi il nostra template al fine ripristinare il collegamento tra lo sfondo e il valore impostato mediante la proprietà Background del Button.

<Border Name="Border" Padding="15" CornerRadius="10" Background="{TemplateBinding Background}">

Come per il Binding anche TemplateBinding è una markup extension e questo ci permette di utilizzarla anche l'attribute sintax e visto che l'ambito di utilizzo è circoscritto all'uso nei template non è necessario specificare la sorgente dati, ma solo la proprietà da utilizzare come fonte dati.

5 pagine in totale: <<Indietro 1 2 3 [4] 5 Avanti >>

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.

TUTORIALS


IN EVIDENZA
MISC