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:
AOP,
PostSharp