L'oggetto padre ItemsControl
L'oggetto principale che va analizzato per primo è ItemsControl. Dispone dei meccanismi fondamentali a creare elenchi ed è la scelta da effettuare se non servono selezioni, ma semplicemente mostrare informazioni. La proprietà principale è ItemsSource che accetta un IEnumerable e quindi tutte le collezioni o array presenti nel .NET Framework. Impostandola, il motore crea una CollectionView specializzata sul tipo di source che si è impostato e ottiene così un oggetto che fa da tramite tra sorgente e controllo, e permette la gestione dell'item corrente e di filtrare, raggruppare e ordinare la sorgente. Ecco un esempio di caricamento della sorgente XML di riferimento:
<ItemsControl ItemsSource="{Binding}">
</ItemsControl>
Impostando ItemsSource si popola automaticamente la proprietà Items che restituisce una collezione di object o permette, se non viene usato ItemsSource, di aggiungere manualmente gli oggetti. Non vi è vincolo sul tipo di item che si intende caricare siccome non è compito dell'oggetto ItemsControl o derivati, di come mostrare le informazioni.
A questo punto il controllo interroga la proprietà ItemsPanel per determinare quale pannello fa da contenitore agli elementi. Normalmente questa proprietà è impostata su StackPanel e ciò significa che ogni elemento è posizionato uno sotto l'altro, ma intervenendo sulla proprietà è possibile già cominciare a modificare il posizionamento degli elementi. Per esempio è possibile impostare un WrapPanel così da disporre gli elementi in orizzontale e andare a capo in funzione dello spazio disponibile:
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Una volta istanziato il pannello, il compito di allineare gli elementi è demandato a quest'ultimo che, informato tramite la proprietà IsItemsHost, conosce la sua relazione con ItemsControl e genera gli elementi visuali, conosciuti con il nome di ItemContainer, per ogni item presente nella sorgente. E' importante capire la relazione fra oggetto/elemento poiché è una differenza molto importante rispetto al passato. Se si pensa che un ItemContainer può essere qualsiasi UIElement si intuisce che ogni item può essere mostrato con immagini, video, oggetti 3D e con ulteriori sotto liste, senza limiti.
La generazione degli elementi è gestita dal pannello, ma l'effettivo lavoro lo compie l'oggetto ItemContainerGenerator esposto dall'omonima proprietà di ItemsControl. Esso conosce l'ItemsControl a cui è legato personalizzando alcuni aspetti della generazione e tramite ContainerFromItem e ItemFromContainer consente di ottenere l'ItemContainer dalla sorgente dati o viceversa.
La personalizzazione avviene interrogando GetContainerForItemOverride con il quale chiede qual è l'elemento visuale da creare per ogni riga, mentre interrogando PrepareContainerForItemOverride, prepara l'elemento creato impostando template e style, appoggiandosi ad ItemContainerStyle e ItemTemplate dell'oggetto ItemsControl. In pratica è possibile intervenire su ogni aspetto, dal pannello ai singoli elementi fino ad arrivare ai template. Di quest'ultimi se ne parla nella seconda parte dell'articolo "WPF: dal DataBinding ai Template".
Le classi specializzate che derivano da ItemsControl, non fanno altro che intervenire sulle proprietà elencate in precedenza sfruttandole appieno e differenziandosi, nella maggior parte dei casi, solo dal punto di vista del layout .
Contenuti dell'articolo
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.






Difficoltà
Utilità
Contenuti
Stampa
Download 


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!
