WPF è il nuovo standard per la realizzazione della interfaccia grafica delle nostre applicazioni. E’ nato per molteplici motivi, uno dei quali è la necessità di dividere lo strato di presentazione dei dati dallo sviluppo dell’applicazione stessa. Un parte molto interessante è il Binding dei dati all’interno delle applicazioni WPF, e insieme al binding non possiamo non menzionare i DataTemplate. Il Binding è una operazione solitamente svolta dai programmatori ma che adesso deve essere accessibile anche in parte al grafico che sta lavorando al look della mia applicazione. Andiamo a vedere come funziona facendo qualche confronto con il mondo Windows Form tradizionale che ormai ci accompagna da un ventennio.
Iniziamo subito con alcuni esempi, e associamo una sorgente dati alla proprietà Text di una TextBox.
Se utilizziamo Visual Studio 2005, probabilmente faremo questa operazione dal PropertyGrid che ci genererà il seguente codice:
[code language="C#"] this.textBox1.DataBindings.Add(new Binding("Text", myDataSource, "Value")); [/code]
dove “Text” è la proprietà della textbox che vogliamo associare alla sorgente dati “myDataSource” e “Value” è il dato da associare. Ovviamente possiamo scrivere direttamente noi il codice per il binding.
In WPF possiamo fare tutto da xaml in questo modo:
[code language="ASPX"] <TextBox Text="{Binding Source=myDataSource,Path=Value}" /> [/code]
Il vantaggio immediato è la possibilità per il grafico di poter implementare direttamente tutta l’interfaccia utente senza andare a scrivere codice, ma utilizzando una sintassi che probabilmente già conosce. Infatti xaml è basato su xml ed eredita inoltre molti concetti del mondo Web.
Torniamo al Binding. Nell’esempio abbiamo inserito all’interno della proprietà Text una struttura compresa tra due graffe (detta MarkupExtension). Siamo andati direttamente ad indicare la sorgente dati e il valore da associare. A runtime questa struttura verrà tradotta nella struttura vera e propria di binding.
La MarkupExtension è ci permette di scrivere in modo molto compatto qualcosa che altrimenti sarebbe articolato e scomodo da scrivere. Il Parser di WPF traduce il primo elemento della MarkupExtension in una classe e i successivi elementi in proprietà della classe stessa. Nel nostro caso la struttura
[code language="ASPX"] {Binding Source=myDataSource,Path=Value} [/code]
verrà tradotta dal parser nel codice per instanziare la classe Binding ed assegnare le proprietà Source e Path dell’oggetto creato. Questo ci lascia intuire che possiamo continuare a popolare le proprietà della classe Binding direttamente da xaml. Iniziamo a chiederci che cosa possiamo utilizzare come sorgente dati; la risposta è TUTTO, o quasi; in generale possiamo utilizzare ogni oggetto che implementa INotifyChanges o le cui proprietà sono delle DependencyProperties (la stragrande maggioranza di oggetti in WPF implementano le proprietà come DependencyProperty).
Quindi possiamo utilizzare oltre a collections, classi custom, DataSet, DataEntity, WebService ed altro, anche oggetti della interfaccia utente come sorgente dati.
[code language="ASPX"] <Slider Height="26" Name="MySlider" Width="193" />
<TextBox Text="{Binding ElementName=MySlider,Path=Value}" Height="30" Width="100"/> [/code]
In questo codice è stato utilizzato un elemento della UI come Sorgente dati di un altro elemento. In questo caso specifico WPF ci viene in aiuto e ci permette di indicare un elemento della interfaccia grafica che fa da sorgente dati attraverso il suo nome con la proprietà “ElementName”. In questo esempio, che ormai è diventato un classico, uno slider visualizza il suo valore attuale nella TextBox. Ad ogni modifica dello slider, vedremo il valore cambiare nella TextBox.