This article has been localized into German by the community.
Die UpdateSourceTrigger Eigenschaft
Im vorigen Artikel haben wir gesehen, wie Änderungen in einer TextBox nicht sofort an die Quelle zurückgeschickt wurden. Stattdessen wurde die Quelle erst aktualisiert, nachdem die TextBox den Fokus verlor. Dieses Verhalten wird durch die Eigenschaft UpdateSourceTrigger gesteuert. Er ist auf den Wert "Default" voreingestellt, was bedeutet, dass die Quelle auf der Grundlage der Eigenschaft, an die Sie sich binden, aktualisiert wird. Beim Schreiben werden alle Eigenschaften außer der Eigenschaft Text aktualisiert, sobald sich die Eigenschaft ändert (PropertyChanged), während die Eigenschaft Text aktualisiert wird, wenn der Fokus auf das Zielelement verloren geht (LostFocus).
"Default" ist natürlich der Standardwert des UpdateSourceTriggers. Die anderen Optionen sind PropertyChanged, LostFocus und Explicit. Die ersten beiden wurden bereits beschrieben, während die letzte lediglich bedeutet, dass das Update manuell über einen Aufruf von UpdateSource auf dem Binding durchgeführt werden muss.
Um zu sehen, wie all diese Optionen funktionieren, habe ich das Beispiel aus dem vorherigen Kapitel aktualisiert, um Ihnen alle zu zeigen:
<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();
}
}
}
Wie Sie sehen, benutzen nun alle drei TextBoxen unterschiedliche UpdateSourceTrigger.
Die erste ist auf Explicit gesetzt, was bedeutet, dass die Quelle nicht aktualisiert wird, es sei denn, Sie machen es manuell. Aus diesem Grund habe ich eine Schaltfläche neben der TextBox hinzugefügt, die den Quellwert bei Bedarf aktualisiert. Im Code-behind finden Sie den Click-Handler mit ein paar Zeilen Code, die die Bindung vom Zielsteuerelement erhalten, und dann die Methode UpdateSource() aufrufen.
Die zweite TextBox verwendet den Wert LostFocus, der eigentlich der Standard für eine Textbindung ist. Das bedeutet, dass der Quellwert jedes Mal aktualisiert wird, wenn das Zielsteuerelement den Fokus verliert.
Die dritte und letzte TextBox verwendet den Wert PropertyChanged, was bedeutet, dass der Quellwert bei jeder Änderung der gebundenen Eigenschaft aktualisiert wird, was in diesem Fall geschieht, sobald sich der Text ändert.
Führen Sie das Beispiel auf Ihrem eigenen PC aus und beobachten Sie, wie sich die drei Textfelder völlig anders verhalten: Der erste Wert wird nicht aktualisiert, bevor Sie auf die Schaltfläche klicken, der zweite Wert wird nicht aktualisiert, bis Sie die TextBox verlassen, während der dritte Wert bei jedem Tastendruck, jeder Textänderung usw. automatisch aktualisiert wird.
Zusammenfassung
Die Eigenschaft UpdateSourceTrigger eines Bindings steuert, wie und wann ein geänderter Wert an die Quelle zurückgesendet wird. WPF ist aber ziemlich gut darin, dies für Sie zu steuern, daher sollte der Standardwert für die meisten Fälle ausreichen, wo Sie den besten Mix aus einer ständig aktualisierten Benutzeroberfläche und guter Performance erhalten.
Für Situationen, in denen Sie mehr Kontrolle über den Prozess benötigen, wird diese Eigenschaft jedoch definitiv hilfreich sein. Stellen Sie nur sicher, dass Sie den Quellwert nicht öfter aktualisieren, als es tatsächlich sein muss. Wenn Sie die volle Kontrolle haben wollen, können Sie den Wert Explicit verwenden und dann die Aktualisierungen manuell durchführen, aber das nimmt ein wenig den Spaß an der Arbeit mit Datenbindungen.