TOC

This article has been localized into Danish by the community.

Databinding:

UpdateSourceTrigger egenskaben

I den forrige artikel så vi hvordan ændringer i en TextBox ikke med det samme blev sendt tilbage til kilden. I stedet blev kilden først opdateret efter fokus var fjernet fra TextBox. Denne opførsel kontrolleres af en egenskab på bindingen ved navn UpdateSourceTrigger. Den har som standard værdien "Default", hvilket betyder, at kilden opdateres ud fra den egenskab, du binder til. For øjeblikket bliver alle egenskaber undtagen Text egenskaben opdateret så snart egenskaben ændres (PropertyChanged), mens Text egenskaben bliver opdateret, når fokus fjernes fra destinationselementet (LostFocus).

Default er, naturligvis, standardværdien af UpdateSourceTrigger. De andre muligheder er PropertyChanged, LostFocus og Explicit. De første to er allerede beskrevet, mens den sidste betyder, at opdateringer skal skubbes til kilden manuelt via et kald til UpdateSource på Binding klassen.

For at vise hvordan, disse indstillinger virker, har jeg opdateret eksemplet fra forrige afsnit til at vise dem alle:

<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();
		}
	}
}

Som du kan se, har de tre tekstbokse nu forskellige UpdateSourceTrigger.

Den første er sat til Explicit, hvilket betyder, at kilden ikke vil blive opdateret med mindre, du gør det manuelt. Derfor har jeg tilføjet en knap ved siden af TextBox kontrollen, som vil opdatere kildeværdien efter anmodning. I code-behind finder du Click handleren, hvor vi bruger et par linjer kode til at hente bindingen fra destinationskontrollen og derefter kalde UpdateSource() metoden på den.

Den anden TextBox bruger LostFocus værdien, hvilket faktisk er standardværdien for en Text binding. Det betyder, at kildeværdien vil blive opdateret hver gang, destinationskontrollen mister fokus.

Den tredje og sidste TextBox bruger PropertyChanged værdien, hvilket betyder, at kildeværdien bliver opdateret hver gang den bundne egenskab ændres, hvilket den i dette tilfælde gør så snart, teksten ændres.

Prøv at køre eksemplet på din egen maskine og se hvordan, de tre tekstbokse virker fuldstænding forskelligt: Den første værdi bliver ikke opdateret før, du klikker på knappen, den anden værdi bliver ikke opdateret før, du forlader TextBox, mens den sidste værdi opdateres automatisk ved hvert tastetryk, tekstændring osv.

Resume

UpdateSourceTrigger egenskaben på en binding afgør hvordan og hvornår en ændret værdi sendes tilbage til kilden. men siden WPF er ret god til at kontrollere dette for dig, vil standardværdien være nok i de fleste tilfælde, hvor du vil få det bedste mix mellem konstant opdateret UI og god performance.

I de tilfælde, hvor du behøver mere kontrol over processen, vil denne egenskab helt sikkert hjælpe dig. Bare vær sikker på, at du ikke opdaterer kilden oftere end du faktisk har brug for. Har du brug for fuld kontrol, kan du bruge Explicit værdien og foretage opdateringen manuelt, men det fjerner og en smule af det fede ved at arbejde med databindinger.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!