Radical 1.0.1 (Vacuum): Model-View-ViewModel
Ho già parlato di alcune novità ma ce ne sono molte altre come ad esempio quelle in “the Model View ViewModel space”.
DelegateCommand
Si è vero un po’ trito e ritrito ma serve sempre :-) e vi permette di fare questo:
il mio delegate command ha però una marcia in più…public class MainPageViewModel : AbstractViewModel { public MainPageViewModel() { this.MyCommand = DelegateCommand.Create() .OnCanExecute( o => true )
.OnExecute( o => { /* execution logic */ } ) ; } public ICommand MyCommand { get; private set; } }
Trigger
I trigger, noti anche come IMonitor, se ben usati vi consentono di facilitare molto la manutenzione e la gestione di scenari che altrimenti sarebbero un groviglio di codice:
è quindi possibile agganciare direttamente al comando, luogo ideale per farlo, la logica che faccia triggherare la rivalutazione dello stato del comando stesso.public class MainPageViewModel : AbstractViewModel { public MainPageViewModel() { this.MyCommand = DelegateCommand.Create() .OnCanExecute( o => true ) .OnExecute( o => { /* execution logic */ } ) .AddMonitor ( PropertyObserver .For( this ) .Observe( v => v.FirstName ) ); } private String _firstName = null; public String FirstName { get { return this._firstName; } set { if( value != this.FirstName ) { this._firstName = value; this.OnPropertyChanged( () => this.FirstName ); } } } public ICommand MyCommand { get; private set; } }
Per fare ciò e vivere sonni tranquilli è però importante avere gli WeakEvent cosa che in Silverlight non esiste proprio… grrrr… :-)
WeakEventManager
Radical arriva con una sua implementazione di WeakEventManager e dell’interfaccia IWeakEventListener che vi consentono di fare una cosa del tipo:
e anche:public IBindableCommand AddMonitor( IMonitor source ) { Ensure.That( source ).Named( "source" ).IsNotNull(); MonitorChangedWeakEventManager.AddListener( source, this ); return this; }
Con il MonitorChangedWeakEventManager definito come abbiamo già avuto modo di vedere. Il tutto finalizzato a gestire correttamente gli eventi senza però rischiare di introdurre il classico “.net memory leak” :-)Boolean IWeakEventListener.ReceiveWeakEvent( Type managerType, object sender, EventArgs e ) { if( managerType == typeof( MonitorChangedWeakEventManager ) ) { this.OnTriggerChanged( ( IMonitor )sender ); } else { return false; } return true; }
.m