Possiamo sfruttare l'engine di data binding anche nella definizione di un template di un controllo, attraverso la markup extension TemplateBinding. Grazie a questa funzionalità possiamo trasferire i valori delle proprietà del controllo ad alcune omologhe proprietà dei controlli presenti nel template, in modo da rendere personalizzabili alcune caratteristiche dei template attraverso il controllo stesso a cui è associato.
Nel seguente esempio, l'elemento principale che definisce il template di un controllo Button, un Grid, avrà come riempimento il colore rosso, definito come proprietà Background del controllo Button stesso.
<Button Content="Button" Background="Red"> <Button.Template> <ControlTemplate TargetType="Button"> <Grid Background="{TemplateBinding Background}"> ... </Grid> </ControlTemplate> </Button.Template> </Button>
La markup extension TemplateBinding è molto importante per aggiungere il giusto grado di adattabilità dei template a più utilizzi, tuttavia il loro impiego è circoscritto a proprietà dello stesso tipo, oltre ad una modalità di binding OneWay, cioè dal controllo alla template.
Per sopperire a queste limitazioni possiamo utilizzare la markup extension RelativeSource specificando TemplatedParent come parametro.
Grazie a questo elemento impostiamo il controllo a cui è associato il template come sorgente del binding, questo ci consente di utilizzare tutti i valori delle proprietà del controllo a tutti gli oggetti del template.
Nel seguente esempio renderizziamo la larghezza in pixel del Button direttamente dentro una TextBox al suo interno.
<Button Content="Button" Background="Red"> <Button.Template> <ControlTemplate TargetType="Button"> <Grid Background="{TemplateBinding Background}"> <TextBox VerticalAlignment="Center" Text="{Binding Width, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Width="30" /> </Grid> </ControlTemplate> </Button.Template> </Button>
Una particolarità di questa implementazione è che consente di impostare una modalità di binding TwoWay, estendendo le funzionalità che possiamo realizzare in un template.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.