This article has been localized into Dutch by the community.
De UpdateSourceTrigger-eigenschap
In het vorige artikel zagen we hoe veranderingen in een TextBox niet onmiddellijk terug verzonden werden naar de bron, de bron werd pas bijgewerkt als de focus was weg gegaan van de TextBox. Dit gedrag wordt gecontroleerd door een eigenschap van de binding die UpdateSourceTrigger heet. De standaard waarde van deze eigenschap is "Default", wat inhoudt dat de bron bijgewerkt wordt op basis van de eigenschap waarmee de binding gelegd is. Op het moment van schrijven worden alle eigenschappen, behalve voor de Text eigenschap, bijgewerkt op het moment dat de eigenschap wijzigt (PropertyChanged), terwijl voor de Text eigenschap het bijwerken plaats vindt wanneer de focus van het doel element weg gaat.
Default is duidelijk de standaard waarde van de UpdateSourceTrigger. De andere opties zijn PropertyChanged, LostFocus en Explicit. De eerste twee zijn reeds beschreven, terwijl de laatste eenvoudigweg inhoudt dat de update handmatig uitgevoerd moet worden door een call te maken naar UpdateSource op de binding.
Om te zien hoe al deze opties werken, heb ik het voorbeeld bijgewerkt van het vorige hoofdstuk om ze allemaal aan je te laten zien:
<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();
}
}
}
Zoals je ziet, gebruikt ieder van de drie textboxes nu een andere UpdateSourceTrigger.
De eerste is gezet op Explicit, wat in de basis inhoudt dat de bron niet eerder bijgewerkt wordt dan wanneer dat handmatig gedaan wordt. Om die reden heb ik een opdrachtknop naast de TextBox gezet, die op aanvraag de update uitvoert van de bron waarde. In de Code-behind, zie je de Click handler, waar we een paar regels code gebruiken om de binding van de doel control te verkrijgen en dan de UpdateSource() methode door deze control te laten uitvoeren.
De tweede TextBox gebruikt de LostFocus waarde en dit is eigenlijk de standaard voor een TextBox binding. Het betekent dat de bron waarde bijgewerkt wordt op het moment dat de doel control focus verliest.
De derde en laatste TextBox gebruikt de PropertyChanged waarde, wat inhoudt dat de bron waarde iedere keer wordt bijgewerkt wanneer de verbonden eigenschap verandert, wat in dit geval ook zo is wanneer de tekst verandert.
Probeer het voorbeeld op jouw eigen machine uit te voeren en neem waar dat de drie textboxes alle drie heel verschillende reageren: de eerste waarde wordt niet eerder bijgewerkt dan nadat je op de opdrachtknop hebt geklikt, de tweede waarde wordt niet eerder bijgewerkt dan nadat je de TextBox verlaat en de derde wordt bijgewerkt na iedere toetsaanslag, tekst aanpassing etc.
Samenvatting
De UpdateSourceTrigger eigenschap van een binding controleert hoe en wanneer een aangepaste waarde terug gestuurd wordt naar de bron. Omdat WPF dit echter redelijk goed regelt voor jou, is de standaard waarde in de meeste gevallen toereikend, waarbij je de beste mix krijgt van een voortdurend bijgewerkte UI en goede prestaties.
Voor die situaties waar je meer controle over het proces nodig hebt, zal deze eigenschap zeker helpen. Zorg er echter voor dat de bron waarde niet vaker bijgewerkt wordt dan nodig is. Als je volledige controle wilt, kun je de waarde Explicit gebruiken om de updates handmatig uit te voeren. Nadeel hiervan is dat het plezier van werken met data bindings enigszins wordt weg genomen.