14

Jan

BindableApplicationBar: un’alternativa alla ApplicationBar di Windows Phone

La ApplicationBar, croce e delizia di tutti i programmatori Windows Phone: delizia perchè è molto utile e ci mette a disposizione un “luogo” in cui posizionare le funzioni principali della nostra applicazione; croce perchè ha una serie di limitazioni che la rendono un elemento un po’ a se rispetto a tutti i controlli di Silverlight. Nello specifico, la ApplicationBar non eredita da FrameworkElement (che è la classe padre di tutti i controlli Silverlight): il risultato è che vengono a mancare tutta una serie di proprietà fondamentali come DataContext.

In parole povere, la ApplicationBar non supporta il binding: se state perciò sviluppando un’applicazione seguendo il pattern MVVM, sarete costretti a “romperlo” per poter gestire gli eventi associati alla pressione dei pulsanti o dei menu item contenuti nella barra.

A risolvere questo problema ci ha pensato Nicolas Humann, uno sviluppatore che ha realizzato una BindableApplicationBar, ovvero una barra che si comporta in tutto e per tutto come quella originale, ma che in più supporta il binding e i command. In questo modo, invece di gestire gli eventi nel code behind, possiamo creare dei Command nel nostro ViewModel e associarli all’evento di tap dei pulsanti tramite il binding.

Una premessa: Nicolas Humann ha aggiornato il suo progetto per supportare Mango. La versione originale non era infatti compatibile con la nuova versione di Windows Phone, date le numerose differenze (Silverlight 4, infatti, a differenza di Silverlight 3 supporta nativamente i Command). La versione pubblicata sul suo blog, però, contiene un bug che fa si che il controllo non funzioni correttamente: se cercate di utilizzarlo così com’è si scatenerà un’eccezione di tipo ArgumentException con messaggio Default value type does not match type of property nel momento in cui verrà caricata la pagina che contiene il controllo.

Nello stesso post di annuncio della release compatibile con Mango un altro sviluppatore però ha indicato la correzione da apportare affinchè tutto funzioni correttamente: in allegato a questo post trovate perciò la versione corretta del controllo che non da errori.

Come usare la BindableApplicationBar

Una volta aggiunta una reference alla libreria Phone7.Fx.Preview.dll, dovete dichiarare il namespace a cui appartiene il controllo nel vostro XAML:

xmlns:Preview="clr-namespace:Phone7.Fx.Preview;assembly=Phone7.Fx.Preview"

Dopodichè, il “cuore” del controllo è il tag BindableApplicationBar, che può contenere due tipi di elementi:

  • BindableApplicationBarIconButton per aggiungere un’icona nella barra.
  • BindableApplicationBarMenuItem per aggiungere un menu item all’elenco.

Attenzione! Se guardate il codice di una pagina che utilizza la ApplicationBar standard, noterete che questa viene dichiarata fuori dalla Grid principale, proprio perché si tratta di un elemento a sé. La BindableApplicationBar, invece, si comporta come tutti gli altri controlli e quindi va inserita all’interno di tale Grid, che tipicamente si chiama LayoutRoot.

Ecco un esempio di BindableApplicationBar inserita all’interno di una pagina vuota:


      
      
      
      

      
      
      
      
      

      
      

      
      
      
      

      


Come vedete nell’esempio, abbiamo creato due metodi (SaveCommand e ShareCommand), che sono in binding con la proprietà Command. Utilizzando la ApplicationBar standard tutto ciò non sarebbe stato possibile!

Vi lascio con il download del codice sorgente della BindableApplicationBar con già apportata la correzione di cui vi ho parlato all’inizio. All’interno della cartella bin trovate la DLL già compilata e pronta per essere usata nei vostri progetti.

Se avete trovato questo post un po’ criptico perchè non sapete bene cosa sono i Command… beh, cercherò di rimediare a breve Smile

P.S.= se state sviluppando un’applicazione per Windows Phone 7.0 e avete necessità di usare la BindableApplicationBar, ecco il post da cui potete scaricare il progetto originale.

by Il blog di Matteo Pagani on 1/14/2012
Post archive