28

Jan

EventToCommand e MVVM Light Toolkit: occhio alla versione che state utilizzando

Dato che questo problema non è capitato solamente a me e che ho perso parecchio tempo prima di capire cosa stava succedendo, ho pensato di condividere la mia esperienza così da farvi risparmiare un po’ di tempo Smile

Il toolkit MVVM Light di Laurent Bugnion include un utilissimo behavior, chiamato EventToCommand, che ci permette di gestire gli eventi esposti da un controllo tramite un command, dandoci la possibilità di non “rompere” il pattern MVVM ed essere costretti a gestirli nel code behind di una view.

Nella versione 7.0 di Windows Phone questo sistema era l’unico possibile per implementare correttamente il pattern MVVM, dato che Silverlight 3 non includeva il supporto per i Command. Nella versione 7.5, in realtà, l’utilizzo di questo behavior è stato notevolmente ridimensionato, dato che l’introduzione di Silverlight 4 ha portato con sè il supporto ai Command.

Resta comunque un prezioso alleato in tutte quelle situazioni in cui il controllo con cui dobbiamo interagire non supporta nativamente i Command oppure espone più eventi che vogliamo gestire. Nel mio caso, mi trovavo nella situazione di dover gestire l’evento ActionIconTapped, scatenato dal controllo PhoneTextBox (introdotto nell’ultima versione del Silverlight Toolkit) quando si fa tap sull’icona che è possibile inserire in fondo alla TextBox.

Il mio XAML era quindi qualcosa di simile:


      
      
      
      
      
      

Nulla di nuovo se siete già abituati ad usare questo behavior nelle vostre applicazioni: il trigger espone una proprietà EventName, in cui andiamo a specificare l’evento che vogliamo gestire, mentre l’EventToCommand è il behavior vero e proprio implementato dal MVVM LIght Toolkit che ci permette di mettere in binding l’evento con un nostro comando (nell’esempio, il nome del command è Search ed è definito nel ViewModel legato alla vista corrente).

Il mio problema era però che, nonostante la sintassi fosse corretta, il behavior non funzionava: al tap sull’icona non si verificava alcuna azione e, mettendo dei breakpoint, ho potuto constantare come il codice definito nel mio command non venisse mai eseguito.

Il problema stava nella versione della libreria Galasoft.MvvmLight.Extras, la quale contiene per l’appunto il behavior EventToCommand. Nel mio caso, partivo da un progetto Windows Phone 7.0, che avevo aggiornato alla versione 7.5: aggiornare un progetto non significa però in automatico aggiornare anche tutte le reference a librerie esterne. La versione più recente di MVVM Light contiene a questo scopo un set di DLL specifiche per Mango, caratterizzate dal suffisso WP71, da utilizzare al posto delle originali, identificate dal suffisso WP7. E’ facile non accorgersi del problema perchè in realtà la libreria Galasoft.MvvmLight.WP7 (che contiene il core del toolkit) funziona perfettamente anche con Mango. Il problema specifico si presenta proprio con la libreria Galasoft.MvvmLight.Extras.WP7, che invece lo mal digerisce.

La soluzione perciò è molto semplice: scaricate la versione più recente del toolkit dal sito ufficiale o da NuGet e assicuratevi di aggiungere una reference alle librerie Galasoft.MvvmLight.WP71 e Galasoft.MvvmLight.Extras.WP71 contenuta nella cartella sl4-windowsphone71

Happy coding!

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