WPF: dal DataBinding ai Template - Prima parte

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

Uso del Binding con XAML

Se quanto abbiamo visto fino adesso non fosse sufficiente a convincerci ad adottare il modello di binding di WPF, non abbiamo ancora considerato che WPF è anche XAML e che ogni classe può essere utilizzata in modo più o meno agevole nel markup, quindi, mixando l'Object Element Sintax e la Property Element Syntax possiamo istanziare la classe Binding e assegnarla alla proprietà Text . Rimuoviamo ogni riga di codice dal codebehind, e modifichiamo il markup nel modo seguente.

<Grid ShowGridLines="True" >
  <Grid.ColumnDefinitions>
    <ColumnDefinition ></ColumnDefinition>
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition></RowDefinition>
    <RowDefinition></RowDefinition>
  </Grid.RowDefinitions>

  <TextBox Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Name="MyTextBox">
    <TextBox.Text>
      <Binding ElementName="MyScroll"  Path="Value" UpdateSourceTrigger="PropertyChanged"/>
    </TextBox.Text>
  </TextBox>
  
  <Slider Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Name="MyScroll"/>

</Grid>

Il Markup precedente è l'equivalente del codice procedurale visto fino a questo momento, eccezion fatta per la proprietà utilizzata per specificare la sorgente dati, ElementName al posto di Source. Naturalmente le proprietà sono mutuamente esclusive e non è possibile specificarle contemporaneamente. L'utilizzo della la proprietà ElementName è preferibile nel Markup, poiché altrimenti saremmo stati costretti a inserire l'oggetto utilizzato come sorgente dati nella collezione Resource della Grid e a utilizzare la markup extension StaticResource per recupararla. Come traspare dal nome, attraverso la proprietà ElementName possiamo specificare come sorgente dati un qualsiasi elemento presente nella nostra applicazione.

Esiste un'altra proprietà per indicare la sorgente dati: RelativeSource. Questa proprietà è particolarmente utile per collegare fra loro proprietà dello stesso oggetto, e trova la sua applicazione come vedremo in seguito nei Template.

Grazie all'utilizzo di XAML siamo riusciti a eliminare ogni traccia del codice procedurale necessario alla creazione del binding, ma la sintassi, benché più snella, risulta ancora verbosa e complessa. Il problema è agevolmente risolvibile, poiché la classe Binding deriva quasi inaspettatamente dal tipo MarkupExtension. Inaspettatamente, perche generalmente ogni classe derivi dal tipo MarkupExtension termina con il suffisso Extension. Alla luce di questa "nuova" scoperta modifichiamo il markup nel modo seguente:

<Grid ShowGridLines="True" >
  
  <Grid.ColumnDefinitions>
    <ColumnDefinition />
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
  </Grid.RowDefinitions>

  <TextBox Text="{Binding ElementName=MyScroll,  Path=Value, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0" Grid.Row="0" Name="MyTextBox"/>

  <Slider Grid.Column="0" Grid.Row="1" Name="MyScroll"/>

</Grid>

Possiamo quindi ricapitolare i quattro elementi fondamentali che entrano in gioco nel binding:

  • la sorgente dati che può essere qualsiasi oggetto.
  • Il percorso della proprietà della sorgenti dati.
  • L'oggetto destinazione del tipo DepenedcyObject sul quale in binding è definito.
  • La proprietà destinazione del tipo DependecyProperty.

Abbiamo visto che il metodo SetBinding ha tra la firma dei suoi parametri il tipo BindingBase dalla quale il tipo Binding eredita. WPF ha altre due classi derivate dal tipo BindingBase: la classe MultiBinding e PriorityBinding. La prima combina più oggetti Binding, ognuno dei quali produce un valore che è poi elaborato in un unico risultato e poi associato alla proprietà destinazione, mentre la seconda crea una collezione di oggetti Binding dei quali soltanto uno di essi fornisce il valore alla proprietà.

Nel PriorityBinding, WPF controlla i vari oggetti Binding nella collezione. Se il primo elemento produce un valore valido, viene assegnato alla proprietà destinazione, altrimenti viene valutato il valore del successivo. Questo ciclo, si protrae fino all'ultimo elemento della collezione e se nessuno degli oggetti Binding, ritorna un risultato valido, viene utilizzato un valore predefinito impostabile mediante la proprietà FallbackValue. WPF monitorizza i vari Binding e se in qualsiasi momento uno fra quelli con maggiore priorità restituisce un valore valido, il motore sostituisce quello del Binding con il livello più basso. La priorità del Binding è determinata dall'indice nella collezione, quindi il primo elemento ha priorità più alta, mentre l'ultimo ha priorità più bassa.

Conclusioni

In questa prima parte dell'articolo abbiamo visto i vantaggi del DataBinding offerto da WPF, nella prossima parte utilizzeremo oggetti del CLR come sorgente dati, li formatteremo attraverso l'uso dell'interfaccia IValueConverter, li valideremo prima di reversarli nella fonte dati e ne personalizzeremo l'aspetto, attraverso l'uso dei Template e DataTemplate.

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

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.
Nick60 scrive:
WPF: dal DataBinding ai Template - Prima parte

L'articolo è ottimo.Vorrei solo suggerire, per rendere il sorgente XAML più semplice e focalizzare l'attenzione del lettore sul tema trattato, di ...
giovedì 1 maggio 2008 | 1 risposta

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



TUTORIALS


IN EVIDENZA
MISC