Liste complesse con ListView
Il controllo ListView consente di effettuare liste, ma che possono variare completamente nel loro aspetto. Sebbene questa cosa si possa già fare intervenendo sul template del controllo, sullo style dell?ItemContainer e sul template di ogni elemento, il ListView consente di cambiare in modo facile da una vista all?altra. La classe eredita infatti da ListBox, perché presenta le medesime funzionalità, e definisce una sola nuova proprietà View di tipo ViewBase. Si tratta di una classe astratta che permette di indicare qual è lo style da applicare al controllo e di preparare gli elementi. Esiste una sola implementazione (è comunque possibile scrivere una vista personalizzata) di tipo GridView che consente di creare una griglia di valori, specificando le colonne da utilizzare.
Ecco un esempio che mostra due colonne, con testo e valore:
<ListView ItemsSource="{Binding}" DisplayMemberPath="Value">
<ListView.View>
<GridView AllowsColumnReorder="true">
<GridViewColumn
DisplayMemberBinding="{Binding XPath=@text}"
Header="Testo"
Width="100"/>
<GridViewColumn
DisplayMemberBinding="{Binding XPath=@value}"
Header="Valore"/>
</GridView>
</ListView.View>
</ListView>
La definizione delle colonne, del Binding e di eventuali template è specifica della GridView e quindi può variare a seconda della vista che si utilizza. In alternativa a DisplayMemberBinding è possibile specificare con CellTemplate il template da adottare per ogni singola cella.
Di seguito il risultato del markup scritto in precedenza:

Conclusione
In questo articolo si è voluto dimostrare quando WPF sia molto versatile e come possa soddisfare qualsiasi esigenza. La carrellata sui controlli mostra come questi siano molto simili nel loro utilizzo e il sistema di generazione degli elementi si distacchi nettamente dai framework di UI, come le WinForm, già esistenti. Inoltre la possibilità di usare i template, della quale si parlerà nel prossimo articolo, garantisce un separazione fra logica, implementata nelle classi, e aspetto grafico, implementato tramite markup.




