Architettura Model-View-ViewModel in un'applicazione WPF
di Cristian Civera, in Windows Presentation Foundatio, 24 febbraio 2009
Gestione delle viste sui dati
La proprietà Threads presa in esame fino a questo momento, essendo una lista, può essere caricata attraverso i controlli di lista presenti in WPF, come ListBox, ComboBox, ListView ecc. Quando questo avviene, il motore di Binding crea una vista che fa da tramite tra il controllo e la sorgente dati. Il metodo statico CollectionViewSource.GetDefaultView permette di ottenere questa vista che implementa l'interfaccia ICollectionView. Tramite essa, e se supportata dalla collezione sorgente, è possibile controllare tutti gli aspetti di navigazione e gestione dei dati, quali l'elemento selezionato, la posizione, il filtro, il raggruppamento e l'ordinamento. Alcuni controlli agiscono su queste informazioni e cambiano di conseguenza, perciò ottenendo la stessa interfaccia all'interno del ViewModel è possibile intercettare i cambiamenti di stato, oppure agire e cambiare le informazioni.
Per esempio, se si volesse selezionare automaticamente il primo thread appena terminato il caricamento della lista, si può raggiungere questo scopo attraverso il precedente metodo OnRefreshAsyncCompleted:
private void OnRefreshAsyncCompleted(object arg) { ... ICollectionView view = CollectionViewSource.GetDefaultView(this.Threads); view.MoveCurrentToFirst(); }
In questo modo la lista dei thread può essere caricata nei modi più disparati nel markup XAML e lo sviluppatore può controllare gli aspetti della vista ignorando tutto l'aspetto grafico e, anche in questo caso, permettendo il testing dell'applicazione.
Di seguito la definizione dell'interfaccia ICollectionView, i cui membri sono auto descrittivi:
public interface ICollectionView : IEnumerable, INotifyCollectionChanged { // Eventi event EventHandler CurrentChanged; event CurrentChangingEventHandler CurrentChanging; // Metodi bool Contains(object item); IDisposable DeferRefresh(); bool MoveCurrentTo(object item); bool MoveCurrentToFirst(); bool MoveCurrentToLast(); bool MoveCurrentToNext(); bool MoveCurrentToPosition(int position); bool MoveCurrentToPrevious(); void Refresh(); // Proprietà bool CanFilter { get; } bool CanGroup { get; } bool CanSort { get; } CultureInfo Culture { get; set; } object CurrentItem { get; } int CurrentPosition { get; } Predicate<object> Filter { get; set; } ObservableCollection<GroupDescription> GroupDescriptions { get; } ReadOnlyObservableCollection<object> Groups { get; } bool IsCurrentAfterLast { get; } bool IsCurrentBeforeFirst { get; } bool IsEmpty { get; } SortDescriptionCollection SortDescriptions { get; } IEnumerable SourceCollection { get; } }
Dal service pack del .NET Framework 3.5 è inoltre disponibile l'interfaccia IEditableCollectionView che alcune viste possono implementare e controlli come il DataGrid possono sfruttare. Questa nuova interfaccia permette di controllare anche gli aspetti di modifica di una sorgente dati, come aggiungere e togliere elementi, e gestire la transazionalità della modifica.
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
-
#76 - Utilizzare il code behind di un UserControl come DataContext in Silverlight 3.0
-
#153 - Invocare servizi WCF da Javascript
-
#157 - Serializzare e deserializzare in JSON con DataContractJsonSerializer
-
Le demo di Silverlight 3.0 Guida Completa sono online
-
.NET Framework 4.0 beta 1: Windows Communication Foundation
-
#118 - Esaminare documenti con namespace con LINQ e XDocument
-
Real Code Day 4.0: Agenda (quasi) completata!
-
Realizzare applicazioni web on the cloud con Microsoft Windows Azure
-
I nuovi Chart Controls di Microsoft per ASP.NET
-
#145 - Eseguire un servizio WCF con privilegi minimi
-
#998 - Effettuare chiamate ad un controller tramite AJAX in ASP.NET MVC
-
Real Code Day 4.0: costruire applicazioni reali - Firenze

















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