4

Feb

I primi passi con Windows 8 e WinRT: Listbox e collezioni di dati

Negli ultimi tempi, grazie anche ai preziosi consigli appresi a WPC seguendo le sessioni di Raffaele Rialdi e Corrado Cavalli, ho iniziato a fare qualche esperimento con WinRT, ovvero il nuovo runtime messo a disposizione da Windows 8 per lo sviluppo di applicazioni Metro style. Se ricordate il post introduttivo che ho pubblicato un po’ di tempo fa WinRT, pur ricalcando l’architettura di vecchie tecnologie come COM, è una novità per chi è cresciuto a pane e .NET: WinRT, al contrario del framework .NET, è un insieme di librerie native, le quali, grazie alle projections, possono essere utilizzate con linguaggi moderni e familiari: C#, VB.NET con XAML o HTML e Javascript.

Pur presentando una nuova architettura, l’approccio e i linguaggi dovrebbero essere famigliari ad uno sviluppatore .NET: è con questa idea in mente che ho iniziato a fare qualche esperimento. Il mio obiettivo era quello di realizzare una semplice applicazione che consentisse di inserire degli elementi all’interno di una lista, con lo scopo di:

  • Ricreare l’approccio con cui sono abituato a sviluppare applicazioni per Windows Phone, grazie al pattern MVVM
  • Sperimentare con il binding e verificare quante delle potenzialità offerte da questa feature del mondo Silverlight / WPF siano disponibili in WinRT

La struttura dell’applicazione è molto semplice:

  • La UI contiene una TextBox, in cui inserire un nome; un pulsante, che aggiunge il nome alla lista; una ListBox, che visualizza l’elenco dei nomi inseriti.
  • Nel codice (nel mio caso, il ViewModel ma poteva essere tranquillamente il code behind) la lista è definita come ObservableCollection. Se ricordate un mio vecchio post sulla ObservableCollection, si tratta di un tipo di collezione speciale che implementa l’interfaccia INotifyCollectionChanged. Questo significa che ad ogni cambiamento nella collezione (nel mio caso, l’aggiunta di un nuovo elemento) il controllo con cui è in binding (la nostra ListBox) si aggiorna automaticamente.

Non sto qui a mostrarvi lo XAML o il codice, perché non è lo scopo di questo post e perché potete guardarli con calma nell’esempio che trovate allegato a questo post.

Il concetto è che un’applicazione apparentemente banale come questa non funzionava: alla pressione del pulsante, non succedeva niente; la ListBox non si aggiornava per mostrare i nuovi elementi inseriti. Un po’ di sano debugging ha rivelato che quello che succedeva dietro le quinte era corretto: la collezione People (di tipo ObservableCollection per l’appunto) conteneva gli elementi inseriti, anche se questi non venivano poi mostrati.

Con un po’ di indagini ho scoperto, grazie a questo post, che WinRT fa uso di un altro meccanismo per gestire queste casistiche, ovvero l’interfaccia IObservableVector. L’applicazione che avevo scritto era perciò corretta: stavo usando però il tipo di collezione sbagliato.

Il problema è che, al momento, non esiste un’implementazione concreta di questa interfaccia: a rimediare a questo inconveniente ci viene incontro Cocoon, una delle prime librerie disponibili su Codeplex per Windows 8. Tale libreria contiene la classe ObservableVector, che non è nient’altro che l’equivalente della ObservableCollection di Silverlight / WPF.

E’ bastato perciò aggiungere una reference a questa libreria nel progetto, impostare il tipo della collezione People a ObservableVector e… ancora l’applicazione non funzionava!

Questa volta la colpa è di bug della Developer Preview, per cui il binding funziona solamente con collezioni generiche di tipo object e non fortemente tipizzate. E’ bastato sostituire perciò ObservableVector con ObservableVector e… questa volta ha funzionato Smile

Questo post vuole essere solamente una dritta se, come me, state iniziando a fare esperimenti con Windows 8 e vi trovate bloccati in questa situazione: non consideratelo un workaround definitivo, stiamo parlando comunque di una Developer Preview e sicuramente questi bug e questi limiti verranno corretti prima del rilascio della versione finale.

Qui sotto trovate il link per scaricare il progetto di esempio di cui vi ho parlato in questo post: per aprirlo e provarlo avete bisogno ovviamente della Developer Preview di Windows 8 con installati i tool di sviluppo (la versione Express di Visual Studio 11, nello specifico).

by Il blog di Matteo Pagani on 2/4/2012
Post archive