per ora è solo un’idea che mi frulla per la testa ma… una cosa che si fa con M-V-VM è la necessità di triggerare la rivalutazione dell’eseguibilità di un ICommand a fronte del fatto che una certa cosa è successa, tipicamente un’altra proprietà del VM è cambiata; un esempio:

Il comando “Browse” non è attivo se la casella di testo “Criteri di Ricerca” (in binding con la proprietà QueryText del VM) è vuota, quando la proprietà QueryText cambia dobbiamo triggerare la rivalutazione dell’eseguibilità dell’ICommand.

Questo in termini di codice spesso si traduce in qualcose del tipo:

public static readonly DependencyProperty QueryProperty = DependencyProperty.Register(
    "Query",
    typeof( String ),
    typeof( SubjectBrowserViewModel ),
    new PropertyMetadata( String.Empty, ( s, e ) =>
    {
        s.CastTo<SubjectBrowserViewModel>()
            .Browse.CastTo<DelegateCommand>()
            .ReevaluateCanExecute();
    } ) );

public String Query
{
    get { return ( String )this.GetValue( QueryProperty ); }
    set { this.SetValue( QueryProperty, value ); }
}

Che non è nulla di trascendentale, ma è una gran rottura e tutte le volte va a finire che me lo dimentico; me lo dimentico perchè devo scriverlo li, o comunque lontano dal ICommand, non sarebbe molto meglio scrivere:

[ReevaluateOnChange( "Query" )]
public IBindableCommand Browse
{
    get;
    private set;
}

e processare in fase di build, quindi niente reflection a runtime, quell’attributo per gestire in maniera implicita la sincronia tra i 2 signori?

Che ne pensate?

.m

Technorati Tags: ,