Questa è la “Commit” di base offerta dall’EditorViewModel
Fa un sacco di belle cose, di cui parleremo, ma è sincrona alla UI quindi se è complessa e comporta un set oneroso di operazioni sul db costa, renderla asincrona è apparentemente banale:protected virtual void CommitEdit() { var data = this.EditContext.Entity; if( this.IsDirty ) { data = this.DataSource.CommitChanges(); } var dc = this.EditContext.DataPolicy.DataContext; var currentState = EntityTransientState.Persistent; var state = this.Memento.GetEntityState( this.DataSource ); if( ( state & EntityTrackingStates.IsTransient ) == EntityTrackingStates.IsTransient ) { currentState = EntityTransientState.Transient; } var args = new CommitRequestArgs( data, dc, currentState ); this.Memento.AcceptChanges(); this.EditContext.Commit( args ); if( this.EditContext.DataPolicy.CommitPolicy == EditorCommitPolicy.HandledByEditor ) { this.OnCommitEdit(args); } this.OnEditCommited(); }
In un ViewModel specializzato… ma non è tutto oro quel che luccica e durante una commit può succedere di tutto e se questo di tutto è asincrono è un filino più complesso da gestire.protected override void CommitEdit() { Action commit = () => base.CommitEdit(); AsyncWorker.Using( new { Host = this, Action = commit } ) .Configure( cfg => { cfg.Before = e => e.Argument.Host.IsBusy = true; cfg.After = e => e.Argument.Host.IsBusy = false; } ) .Execute( e => e.Argument.Action() ); }
.m
Imported comment, original author: Gian Maria
ReplyDeleteSante parole, solo che in molti casi la logica asincrona è l'unico modo di procedere.
La cosa che trovo più difficile da fare è la validazione, comunque l'utente è solitamente molto più felice... outlook docet
Imported comment, original author: Corrado Cavalli
ReplyDeleteLa risposta alla validazione sta nell'interfaccia INotifyDataErrorInfo :-)
Mauro, che fai, col tuo Captcha mi fa lavorare gratis per Google :-)
Imported comment, original author: Mauro Servienti
ReplyDelete- +1 per INotifyDataErrorInfo :-)
- per il re-comediavolosidice lamentatevi con Ughetto :-)
.m