RadicalCome ho già detto è live la prima alpha di Radical con il supporto per Silverlight 4 e Windows Phone 7: http://radical.codeplex.com/releases/view/46757
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:
public class MainPageViewModel : AbstractViewModel
{
    public MainPageViewModel()
    {
        this.MyCommand = DelegateCommand.Create()
            .OnCanExecute( o => true ) 
.OnExecute( o => { /* execution logic */ } ) ; } public ICommand MyCommand { get; private set; } }
il mio delegate command ha però una marcia in più…
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:
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; }
}
è quindi possibile agganciare direttamente al comando, luogo ideale per farlo, la logica che faccia triggherare la rivalutazione dello stato del comando stesso.
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:
public IBindableCommand AddMonitor( IMonitor source )
{
    Ensure.That( source ).Named( "source" ).IsNotNull();
    MonitorChangedWeakEventManager.AddListener( source, this );

    return this;
}
e anche:
Boolean IWeakEventListener.ReceiveWeakEvent( Type managerType, object sender, EventArgs e )
{
    if( managerType == typeof( MonitorChangedWeakEventManager ) )
    {
        this.OnTriggerChanged( ( IMonitor )sender );
    }
    else
    {
        return false;
    }

    return true;
}
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” :-)
.m