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.
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.
Guida Windows Azure Code SnippetsLe migliori pratiche per far girare le applicazioni "in the cloud",... |
Guida ASP.NET MVC Best PracticesUn workflow dettagliato e ricco di suggerimenti pratici per... |
Guida ASP.NET Starter KitUn modo semplice per imparare ad utilizzare le tecnologie Microsoft... |
Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.
Iscriviti alla newsletter
|
|
Amministratore di Reti Windows Server 200820 Febbraio 2012 a Milano |
|
Nessun corso previsto |