L'engine di binding in Silverlight è uno strumento molto potente e altrettanto flessibile, che ci permette un'ottima organizzazione del codice soprattutto in ottica Model-View-ViewModel, in cui possiamo avere una buona separazione delle responsabilità di ogni classe.
In molte delle nostre pubblicazioni abbiamo visto come il ViewModel rappresenti il gestore dei dati - da e verso - l'interfaccia, appunto la View. Con la proprietà Mode=TwoWay, il valore modificato dall'utente nell'interfaccia si propaga verso la proprietà in binding, nel controllo TextBox questa propagazione avviene alla perdita del focus sul controllo. Grazie all'uso della classe EventTrigger, dell'assembly System.Windows.Interactivity (di cui abbiamo già parlato anche nello script #102), possiamo realizzare un TriggerAction che scateni l'aggiornamento del binding direttamente ogni volta che viene digitato un carattere, in concomitanza dell'evento TextChanged.
Di seguito vediamo UpdateSourceBindingAction quale l'implementazione del nostro TriggerAction:
/// <summary> /// Update the source calling BindingExpression.Update for the specified property /// </summary> [Description("Update the source calling BindingExpression.Update for the specified property")] public class UpdateSourceBindingAction : TriggerAction<FrameworkElement> { public readonly static DependencyProperty PropertyProperty = DependencyProperty.Register("Property", typeof(String), typeof(UpdateSourceBindingAction), new PropertyMetadata(null, OnPropertyChanged)); private DependencyProperty property; /// <summary> /// Initializes a new instance of the <see cref="UpdateSourceBindingAction"/> class. /// </summary> public UpdateSourceBindingAction() { } /// <summary> /// Gets or sets the property to update. /// </summary> /// <value>The property.</value> public String Property { get { return this.GetValue(PropertyProperty) as String; } set { this.SetValue(PropertyProperty, value); } } /// <summary> /// Called after the action is attached to an AssociatedObject. /// </summary> protected override void OnAttached() { base.OnAttached(); SearchProperty(); } private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { UpdateSourceBindingAction u = (UpdateSourceBindingAction)d; u.SearchProperty(); } private void SearchProperty() { if (this.AssociatedObject == null) { this.property = null; return; } string propertyName = this.Property + "Property"; FieldInfo field = this.AssociatedObject.GetType().GetField(propertyName, System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); if (field != null) this.property = field.GetValue(null) as DependencyProperty; else this.property = null; } /// <summary> /// Invokes the specified o. /// </summary> /// <param name="o">The o.</param> protected override void Invoke(object o) { if (property == null) return; BindingExpression be = this.AssociatedObject.GetBindingExpression(this.property); if (be != null) be.UpdateSource(); } }
Il suo utilizzo è molto semplice, ecco un esempio:
<TextBox Text="{Binding Testo, Mode=TwoWay}"> <i:Interaction.Triggers> <i:EventTrigger EventName="TextChanged"> <behaviors:UpdateSourceBindingAction Property="Text" /> </i:EventTrigger> </i:Interaction.Triggers> </TextBox>
A seguito dell'evento TextChanged viene invocato il metodo Invoke della classe TriggerAction che recupera l'espressione di binding associata alla proprietà Text (descritta con la proprietà Property), di cui forza esplicitamente la propagazione del valore verso la proprietà di destinazione, definita nell'espressione di binding.
In allegato potete trovare la classe e un esempio completo.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Ottenere un token di accesso per una GitHub App
Creare una libreria CSS universale: Immagini
Collegare applicazioni server e client con .NET Aspire
Configurare lo startup di applicazioni server e client con .NET Aspire
Recuperare App Service cancellati su Azure
Filtering sulle colonne in una QuickGrid di Blazor
Gestione degli eventi nei Web component HTML
.NET Conference Italia 2024
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Anonimizzare i dati sensibili nei log di Azure Front Door
I più letti di oggi
- a #RealCodeConf4 il 25 maggio a Firenze parleremo di #silverlight4. iscrizioni gratis su http://u.aspitalia.com/g9
- #HTML5 schema per avere l'intellisense su #VS2008 (anche express) http://u.aspitalia.com/ed
- Parallelizzare le chiamate HTTP con async/await e le Promise in JavaScript
- Rendere sicuro l'endpoint di HealthCheck in ASP.NET Core
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!