This article is currently in the process of being translated into Croatian (~99% done).
The UpdateSourceTrigger property
U prethodnom članku smo vidjeli kako promjene u TextBoxu nisu odmah poslane prema izvoru. Umjesto toga, izvor je ažuriran samo nakon što smo maknuli fokus s TextBoxa. Ovo ponašanje kontrolira svojstvo na vezi imena UpdateSourceTrigger. Njegova podrazumijevana vrijednost je "Default", što znači da se izvor ažurira na temelju svojstva s kojim ga povežete. Kod pisanja, sva svojstva osim Text svojstva se ažuriraju čim se svojstvo promjeni (PropertyChanged), dok se Text svojstvo ažurira tek nakon što makne fokus.
Default je, očito, podrazumijevana vrijednost UpdateSourceTriggera. Druge opcije su PropertyChanged, LostFocus i Explicit. Prve dvije su već opisane, dok zadnja jednostavno znači da se izmjena mora pogurati ručno pomoću poziva metode UpdateSource na Bindingu.
Kako bismo vidjeli kako ove opcije rade, ažurirao sam primjer iz prethodnog poglavlja:
<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();
}
}
}
Kao što možete vidjeti, svaki od triju textboxova koristi drugačiji UpdateSourceTrigger.
Prvi je postavljen na Explicit što u biti znači da se izvor neće ažurirati osim ako to ručno ne napravimo. Iz tog razloga dodali smo dugme uz TextBox koje će ažurirati izvor na zahtjev. U pozadinskom kodu ćete naći Click rukovatelj, gdje koristimo nekoliko linija koda kako bi dohvatili binding iz odredišne kontrole i onda pozvali UpdateSource() nad njim.
Drugi TextBox koristi LostFocus vrijednost, koja je u biti podrazumijevana vrijednost za Text povezivanje. To znači da će se vrijednost izvora ažurirati svaki puta kada odredišna kontrola izgubi fokus.
Treći i zadnji TextBox koristi PropertyChanged vrijednost, što znači da će se vrijednost izvora ažurirati svaki puta kada se povezano svojstvo promijeni, što u ovom slučaju i čini svaki puta kada se tekst promijeni.
Pokušajte pokrenuti ovaj primjer na vašem računalu i vidite kako se ova tri textboxa ponašaju potpuno drugačije. Prva vrijednost se neće ažurirati dok ne pritisnete dugme, druga vrijednost se neće ažurirati sve dok ne izađete iz TextBox kontrole, dok će se treća vrijednost automatski ažurirati kod svakog pritiska neke tipke na tipkovnici, kod promjene teksta itd.
Sažetak
UpdateSourceTrigger svojstvo za povezivanje upravlja time kako se i kada izmijenjena vrijednost šalje natrag izvoru. Međutim, s obzirom da je WPF prilično dobar u tome da to odradi za vas, podrazumijevana vrijednost bi u većini slučajeva trebala biti dovoljna, pri čemu ćete dobiti najbolju mješavinu stalnog ažuriranja grafičkog sučelja i dobrih performansi.
Za one situacija kada trebate imati veću kontrolu nad procesom, ovo će vam svojstvo zasigurno pomoći. Samo se osigurajte da ne ažurirate izvor češće no što je to stvarno potrebno. Ako želite imati potpunu kontrolu, možete koristiti Explicit vrijednost i onda ažurirati izvor ručno, ali ovo umanjuje zabavu u radu s povezivanjem podataka.