This article has been localized into Italian by the community.
La Proprietà UpdateSourceTrigger
Nell'articolo precedente abbiamo visto come le modifiche in un TextBox non vengano immediatamente inviate indietro alla fonte. Invece, la fonte si aggiornava solo dopo che la selezione si era spostata dal TextBox. Questo comportamento è controllato da una proprietà sul binding chiamata UpdateSourceTrigger. Il suo valore di default è "Default", che in pratica significa che la fonte è aggiornata in base alla proprietà alla quale esegui il bind. Come scritto, tutte le proprietà eccetto la proprietà Text, si aggiornano appena la proprietà cambia (PropertyChanged), mentre la proprietà Text viene aggiornata quando l'elemento di destinazione perde la selezione.
Default è, ovviamente, il valore di default di UpdateSourceTrigger. Le altre opzioni sono PropertyChanged, LostFocus e Explicit. Le prime due sono già state descritte, mentre l'ultima significa semplicemente che l'aggiornamento deve essere effettuato manualmente, utilizzando una chiamata a UpdateSource sul binding.
Per vedere come tutte queste opzioni lavorano, ho aggiornato la form di esempio del precedente capitolo per mostrarti tutte queste opzioni:
<Window x:Class="WpfTutorialSamples.DataBinding.DataContextSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataContextSample" Height="130" Width="310">
<StackPanel Margin="15">
<WrapPanel>
<TextBlock Text="Window title: " />
<TextBox Name="txtWindowTitle" Text="{Binding Title, UpdateSourceTrigger=Explicit}" Width="150" />
<Button Name="btnUpdateSource" Click="btnUpdateSource_Click" Margin="5,0" Padding="5,0">*</Button>
</WrapPanel>
<WrapPanel Margin="0,10,0,0">
<TextBlock Text="Window dimensions: " />
<TextBox Text="{Binding Width, UpdateSourceTrigger=LostFocus}" Width="50" />
<TextBlock Text=" x " />
<TextBox Text="{Binding Height, UpdateSourceTrigger=PropertyChanged}" Width="50" />
</WrapPanel>
</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace WpfTutorialSamples.DataBinding
{
public partial class DataContextSample : Window
{
public DataContextSample()
{
InitializeComponent();
this.DataContext = this;
}
private void btnUpdateSource_Click(object sender, RoutedEventArgs e)
{
BindingExpression binding = txtWindowTitle.GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();
}
}
}
Come puoi vedere, ognuna di queste 3 textbox utilizzano un differente UpdatesourceTrigger.
La prima è impostata su Explicit, e significa che la sorgente non sarà aggiornata fino a che non lo fai manualmente tu. Per questa ragione, ho aggiunto un bottone accanto alla TextBox, che aggiornerà la sorgente. Nel codice, troverà che il click handler, ci sono un paio di righe di codice che ottengono il binding dal controllo di destinazione e poi chiamano il metodo UpdateSource().
La seconda TextBox usa il LostFocus, che è il valore di default per il binding della proprietà Text. Questo significa che il sorgente verrà aggiornata ogni volta che il controllo di destinazione perde il focus.
Il terzo e l'ultima TextBox usa il valore PropertyChanged, significa che il sorgente sarà aggiornato ogni volta che la proprietà associata cambia, che in questo caso avverrà non appena cambia il testo.
Prova a lanciare l'esempio sul tuo computer e vedrai come le tre textbox agiscono in modo diverso: il primo valore (il titolo) non si aggiorna finché non clicchi sul tasto "*", il secondo (la larghezza della finestra) non si aggiorna finché la TextBox non perde il focus, mentre il terzo (l'altezza della finestra) si aggiorna automaticamente quando digiti un numero, cambi la dimensione etc.
Riepilogo
La proprietà UpdateSourceTrigger di un binding controlla come e quando un valore modificato viene rimandato alla sorgente. Tuttavia, siccome WPF è abbastanza bravo a controllare questo per te, il valore di default dovrebbe bastare nella maggior parte dei casi, dove puoi ottenere il miglior mix tra un'interfaccia costantemente aggiornata e una buona performance.
Per quelle situazioni dove hai bisogno di maggior controllo sul processo, questa proprietà ti potrà sicuramente aiutare. Solo per essere sicuri che non aggiorni il valore della fonte più spesso del necessario. Se vuoi il pieno controllo, puoi usare il valore Explicit ed eseguire gli aggiornamenti manualmente, ma questo toglie un po' del divertimento di lavorare con i data binding.