ASP.Net  »  Articoli  »  Silverlight 

Applicare il pattern MVVM con Silverlight: i comandi

di: Andrea Boschin     19 Maggio 2010

Nella puntata scorsa sono stati introdotti i concetti di base relativi il pattern Model-View-VievModel. Ad una breve introduzione storica, è seguito un esempio nel quale si è dimostrato come attingere ai dati esposti dal model per visualizzarli nell'interfaccia utente, e viceversa come intercettare e gestire l'iterazione dell'utente mediante dei semplici comandi.

Pur nella sua estrema semplicità l'esempio ha sostanzialmente riassunto il funzionamento del pattern MVVM dimostrando come separare la user-interface da logica e modello.

Tuttavia quanto illustrato non è sufficiente a completare una applicazione in tutte le sue parti. Se è vero che siamo stati in grado di popolare una semplice ListBox, intercettare la pressione di un pulsante e aggiornare di conseguenza la lista, è altrettanto vero che in una applicazione reale ci sono logiche molto più complesse e raffinate da gestire. Potremmo ad esempio voler abilitare e disabilitare elementi dell'interfaccia in seguito alle azioni dell'utente, oppure gestire comandi di diversa natura rispetto il semplice click di un pulsante.

CommandParameter

Gli esempi di codice della scorsa puntata mostrano come collegare un comando con il click di un pulsante. Per mettere in atto questo collegamento abbiamo fatto uso di un costrutto particolare di XAML, cioè di una attached property.

La proprietà - del cui intimo funzionamento parleremo poco oltre - consente di specificare due parametri; il primo è il comando stesso, per il quale si fa uso del databinding, e l'altro è il CommandParameter, ovvero un parametro che potremo associare all'esecuzione del comando.

Proviamo nel nostro esempio ad associare una stringa che ci consenta di discriminare tra due pulsanti collegati al medesimo DelegateCommand. Innanzitutto occorre cambiare il tipo generico del DelegateCommand da object a string. Il tipo così specificato è appunto il tipo del parametro che dovremmo immettere nel CommandParameter:

this.SearchCommand =  new DelegateCommand(this.Search, this.CanExecuteSearch); 

A questo punto dobbiamo per forza modificare anche il metodo Search che riceverà in input il valore del parametro. Ecco come:

private void Search(string action)
{
  if (action == "Clear")
  {
    this.SearchKey = string.Empty;
    this.Products.Clear();
  }
  else if (action == "Search")
    this.Load(this.SearchKey);
}

È chiaro che l'assegnazione di una stringa vuota alla proprietà SearchKey, provocherà la modifica del contenuto della casella di testo solamente se essa è implementata facendo uso di INotifyPropertyChanged. Grazie a questa interfaccia infatti il databinding sarà in grado di rilevare la modifica e aggiornare la TextBox.

A questo punto non ci rimane che modificare lo XAML aggiungendo un pulsante "Clear" e modificando il precedente con "Search":

 
<Button Grid.Column="1" Margin="0,3,3,3" Content="Search" 
        cmd:Click.Command="{Binding SearchCommand}"
        cmd:Click.CommandParameter="Search" />
<Button Grid.Column="2" Margin="0,3,3,3" Content="Clear"
        cmd:Click.Command="{Binding SearchCommand}"
        cmd:Click.CommandParameter="Clear" />

Così facendo il metodo Search riceverà la stringa di CommandParameter. Questa tecnica trova svariate applicazioni nel pattern ViewModel, qualora sia necessario specificare dei valori accessori che sono necessari per un comando.

Guide ASP.Net

Guida Windows Azure Code Snippets

Le migliori pratiche per far girare le applicazioni "in the cloud",...

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Amministratore di Reti Windows Server 2008

20 Febbraio 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto