Associare un oggetto ICommand a qualunque evento di un controllo in Silverlight 4.0

di Alessio Leoncini, in Silverlight 4.0,

In Silverlight 4.0 è stato introdotto il supporto all'interfaccia ICommand in modo da poter definire il comportamento di una determinata azione dell'utente direttamente nel classi di ViewModel, anzichè nel gestore dell'evento corrispondente del code behind dello UserControl.

Questa funzionalità sfrutta l'engine di data binding per associare un oggetto che implementa tale interfaccia all'evento Click dei controlli di tipo ButtonBase, come Button e HyperLinkButton.

Con l'espressione:

XAML
<Button Content="Seleziona"
                Command="{Binding SelectedChangedCommand}" />

viene eseguito il metodo Execute implementato dall'oggetto SelectedChangedCommand; nell'esempio sottostante l'oggetto GenericCommand definisce tale metodo attraverso un delegato, in modo da rendere riutilizzabile l'oggetto stesso.

C#
public GenericCommand<People> SelectedChangedCommand {get; set;}

//..
SelectedChangedCommand = new GenericCommand<People>((item) =>
{ 
    SelectedItem = item;
});

Per l'implementazione dell'oggetto GenericCommand, si veda il codice allegato.

La comodità di questa modalità è quella di definire la logica di funzionamento tutta all'interno del ViewModel, responsabilizzando quest'ultimo di tutta la logica applicativa, e soprattutto di toglierla al code behind.

Nella versione 4.0 del plugin l'interfaccia ICommand è gestita solo nell'evento Click dei controlli citati sopra, tuttavia, grazie alla libreria System.Windows.Interactivity, distribuita nell'SDK di Expression Blend 4, abbiamo la possibilità di associare un oggetto ICommand a qualunque altro evento dei nostri controlli.

Dopo aver referenziato la dll menzionata ed aver registrato il namespace corrispondente:

XAML

possiamo definire un oggetto EventTrigger con associato l'evento che vogliamo gestire con la proprietà EventName, ed assegnare l'ICommand da eseguire con l'oggetto InvokeCommandAction ed i suoi parametri Command e CommandParameter.

XAML
<ListBox x:Name="listBox"
                 Height="300"
                 DisplayMemberPath="FirstName"
                 ItemsSource="{Binding Items}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding SelectedChangedCommand}"
                                           CommandParameter="{Binding SelectedItem, ElementName=listBox}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </ListBox>

Con la proprietà CommandParameter trasferiamo l'elemento della ListBox selezionato al delegato, in modo da averlo a disposizione direttamente nel codice.

Con l'aiuto di Expression Blend, la gestione di questi oggetti può essere eseguita in modo assistito dall'interfaccia, senza la necessità di scrivere manualmente alcun codice XAML.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi