Ad una ListBox generalmente possiamo fornire oggetti da visualizzare in due modi differenti: o utilizziamo il data-binding con la proprietà ItemsSource oppure accedendo alla proprietà Items, attraverso la quale possiamo aggiungere/rimuovere/ricercare oggetti.
La proprietà Items è di tipo ItemCollection, una classe che espone un’interfaccia davvero semplice e potente al tempo stesso. Supponiamo di avere una Window con una ListBox popolata in questo modo. Se volessimo accedere agli oggetti contenuti nella ListBox possiamo scrivere in C# quanto segue:
1 ItemCollection photos = ListPhotosSelected.Items;
Possiamo sapere se la collection è vuota attraverso la proprietà IsEmpty.
Possiamo navigare all’interno della collection con un set di metodi: MoveCurrentTo(object item), MoveCurrentToFirst(), MoveCurrentToLast(), MoveCurrentToNext(), MoveCurrentToPosition(int position) e MoveCurrentToPrevious(). Dal momento che possiamo navigare nella collection in avanti e all’indietro, possiamo utilizzare le proprietà IsCurrentAfterLast e IsCurrentBeforeFirst.
Ma questi sono tutti dettagli tecnici, che tra l’altro potete trovare anche voi nella members list della classe ItemCollection su MSDN.
Quello che voglio dirvi è spiegarvi per cosa tutto questo mi è stato utile stasera.
Prima di vuole un preambolo: prometto di essere veloce. 🙂
Questo qui sopra è lo screenshot del plug-in che sto realizzando per poter inserire foto prese da Flickr direttamente nei post scritti con Windows Live Writer. E’ suddiviso logicamente in tre parti: nella parte evidenziata in rosso l’utente specifica il nome dell’utente Flickr, poi c’è un pulsante ed una Combox che elenca i photoset di quell’utente. Quando si seleziona un photoset, viene popolata la parte della Window evidenziata in verde scuro: ovvero, le fotografie appartenenti al photoset selezionato dalla Combox. L’ultima parte – quella in violetto – contiene le foto che l’utente vuole inserire nel post di WLW: la ListBox qui contenuta viene popolata tramite drag’n’drop, sfruttando le meravigliose classi di supporto di Beatriz Costa. Un consiglio spassionato: se avete bisogno di implementare il drag’n’drop in un’applicazione WPF, non buttate via il vostro tempo (prezioso). Studiatevi un attimo quello che ha fatto Beatriz Costa e vivrete tutti più felici.
Arrivo al dunque. Quando l’utente clicca il pulsante Ok, voglio generare il codice HTML per inserire le tre fotografie che sono state draganddroppate nella ListBox. L’handler dell’evento Click sul Button Ok è davvero semplice:
1 private void ConfirmButton_Click(object sender, RoutedEventArgs e)
2 {
3 FlickrBrowserPhoto p;
4 ItemCollection photos = ListPhotosSelected.Items;
5
6 if (!photos.IsEmpty)
7 {
8 while (photos.MoveCurrentToNext())
9 {
10 p = (FlickrBrowserPhoto)photos.CurrentItem;
11 _photosHtml = string.Concat(_photosHtml, "<img src="", p.Url, "" />");
12 }
13
14 this.DialogResult = true;
15 }
16 else
17 {
18 this.DialogResult = false;
19 }
20 }
Ottengo l’istanza di ItemCollection dalla ListBox. Se non è vuota, ciclo tutti gli elementi, castando ciascun elemento al tipo che conosco: in questo caso si tratta di FlickrBrowserPhoto, che è una classe custom sviluppata ad-hoc. Il resto non è importante, è solo logica applicativa che costruisce l’HTML da restituire al chiamante attraverso il membro privato _photosHtml.
Un’ultima cosa importante. Il metodo MoveCurrentToNext() ritorna un booleano che dice se l’operazione è avvenuta con successo oppure no. Alla riga 6 la proprietà CurrentItem vale null, e CurrentPosition vale -1. Questo perchè appena si accede alla collection il cursore interno è prima del primo elemento: ecco perchè ho usato un while invece di un do…while: l’avanzamento del cursore attraverso il metodo MoveCurrentToNext() deve essere fatto anche in corrispondenza della prima iterazione.
Technorati Tags: .NET Framework wpf ListBox items