Architettura Model-View-ViewModel in un'applicazione WPF
di Cristian Civera, in Windows Presentation Foundatio, 24 febbraio 2009
La classe ViewModelBase
Pronta la parte di accesso alle informazioni, si procede con la prepazione del ViewModel che richiede una visione globale di ciò che si vuole rendere disponibile, in termini di informazioni di stato e di funzionalità. Con il primo si intendono quelle informazioni che se sfruttate dal motore di Binding di WPF o dai Trigger attraverso la View, permettono di variare l'interfaccia in funzione di esse. Con funzionalità si intendono invece le operazioni che si vogliono rendere disponibili all'interfaccia, quali potrebbero essere: carica, salva, stampa, esci ecc.
Per facilitare quindi lo sviluppo del ViewModel, l'adozione di una classe base diventa quasi d'obbligo per rendere disponibili funzionalità base utili per il Binding e per eventualmente eliminare risorse unmanaged. La classe ViewModelBase implementa quindi INotifyPropertyChanged per notificare quando le informazioni di stato cambiano ed eredita da Component per implementare il pattern Dispose per il rilascio delle risorse.
public abstract class ViewModelBase : Component, INotifyPropertyChanged { private PropertyChangedEventHandler _propertyChanged; event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged { add { _propertyChanged += value; } remove { _propertyChanged -= value; } } protected virtual void OnPropertyChanged(string propertyName) { OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { if (_propertyChanged != null) _propertyChanged(this, e); } }
Partendo dalle funzionalità solite della finestra principale fino ad arrivare ai dettagli di un post, allo sviluppatore insieme al grafico è richiesta una collaborazione nell'individuare come organizzare il ViewModel al quale ad ognuno solitamente viene associata una View. Per esempio, la finestra principale ha sicuramente un comando per chiudere l'applicazione, uno per ottenere la lista dei threads, espone i threads più altre informazioni di stato, come potrebbe essere una proprietà IsLoading per conoscere se è in corso il caricamento dei threads.
Nell'immagine successiva si può quindi vedere come l'autore ha scelto di preparare il ViewModel.

La MainWindowViewModel è la classe inziale ed è il punto di unione con la rispettiva View che semplicemente è una Window il cui DataContext è il ViewModel stesso. In questo modo dalla View, cioè dal markup XAML, è possibile interrogare tramite Binding le informazioni. Si modifica quindi il metodo OnStartup per inizializzare la finestra.
public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); // Inizializzo la View, normale classe che si genera con XAML MainWindow mainWindow = new MainWindow(); // Inizializzo il ModelView MainWindowViewModel mainWindowView = new MainWindowViewModel(); // Associo il ModelView alla View mainWindow.DataContext = mainWindowView; mainWindow.Show(); } }
Prendendo in esame la proprietà IsLoading, si può vedere come semplicemente questa faccia appoggio su un campo privato e sfrutti il metodo OnPropertyChanged per notificare il cambio della proprietà.
private bool _isLoading; public bool IsLoading { get { return _isLoading; } private set { _isLoading = value; OnPropertyChanged("IsLoading"); } }
Questa proprietà può quindi essere interrogata dalla View per mostrare testualmente lo stato, un'icona, un'immagine o eseguire un'animazione, a discrezione comunque del grafico. Il DataContext impostato a livello di root (la Window) permette di vedere l'intero ViewModel per tutto il ramo degli oggetti figli.
<TextBlock Text="{Binding IsLoading}" />
Attenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 3
- Pagina 4
- Pagina 5
- Pagina 6
- Pagina 7
Sullo stesso argomento
-
MetadataDiffViewer: aggiornato al .NET Framework 4.0, Silverlight 4.0 e Sharepoint 2010
-
Moonlight 2.0 Preview: Silverlight per Linux
-
#64 - Blue Style TabControl per Silverlight 3.0
-
#73 - Data binding con collezioni statiche in Silverlight 3.0
-
Scopri i nostri nuovi libri su ASP.NET 4.0, C# 4 e Visual Basic 2010: in offerta lancio al 20% di sconto!
-
Disabilitare tutti i web control in una pagina?
-
#131 - Disegnare linee in una scena 3D WPF
-
#111 - Personalizzare la serializzazione delle entità di ADO.NET Data Services
-
.NET Framework 4.0 beta 1: Workflow Foundation 4.0
-
#126 - Simulare la clausola Single con Entity Framework
-
#160 - Forzare il caricamento dei metadati con Entity Framework
-
#1009 - Evitare attacchi basati su tampering dei dati in ASP.NET MVC

















Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.