Se avete provato a sviluppare applicazioni Silverlight per Windows Phone 7 (derivante in gran parte su Silverlight 3), avrete notato che il controllo Button non ha una proprietà Command, utilizzata spessissimo se sviluppate le vostre applicazioni con l’ormai famoso pattern MVVM, e che consiglio di utilizzare per tutte le applicazioni “non banali” (leggi “non demo” ).
Fortunatamente, comunque, l’infrastruttura per gestire il Commanding è supportata e perfettamente funzionante. Infatti potete tranquillamente creare i vostri ViewModel esponendo proprietà di tipo ICommand. Come fare però ad agganciare i controlli della UI a queste proprietà?
Per questo proposito ci corre in aiuto il Behaviour EventToCommand creato dall’MVP Laurent Bugnion nel suo MVVM Light Toolkit (toolkit disponibile anche per WPF e Silverlight 4).
Questo behaviour permette di essere agganciato a qualsiasi evento di un oggetto, purché esso derivi da DependencyObject (la stragrande maggioranza dei controlli UI) e che chiamerà, allo scatenarsi dell’evento voluto, il Command specificato nello XAML tramite Binding.
In pratica, è possibile scrivere questo codice nell’editor XAML per eseguire il Comando TestCommand quando si clicca sul Button :
- <Button Content="Click me">
- <Interactivity:Interaction.Triggers>
- <Interactivity:EventTrigger
- EventName="Click">
- <Galasoft:EventToCommand Command="{Binding TestCommand}"/>
- </Interactivity:EventTrigger>
- </Interactivity:Interaction.Triggers>
- </Button>
I namespace Interactivity e Galasoft, importati rispettivamente dagli assembly System.Windows.Interactivity e Galasoft.MvvmLight.Extras.WP7, sono cosi dichiarati:
- xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
- xmlns:Galasoft="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP7"
Naturalmente è possibile utilizzare il Behaviour anche per altri tipi di eventi e controlli, ed è inoltre possibile indicare un eventuale CommandParameter, l’argomento EventArgs dell’evento e molto altro.
Alla prossima.