TOC

This article has been localized into Swedish by the community.

Databindning:

Egenskapen "UpdateSourceTrigger "

I föregående avsnitt såg vi att ändringar i vår "TextBox" inte omedelbart sändes tillbaka till källan. Uppdatering av källan skedde först då fokus flyttades från "TextBox". Detta styrs av en egenskap hos bindningen som kallas UpdateSourceTrigger. Om inget annat anges kommer denna egenskap att anta värdet "Default", vilket innebär att källans uppdatering är beroende på på den egenskap man binder till. Då det gäller "writing" så uppdateras alla egenskaper förutom "Text"-egenskapen så snart egenskapen ändras (styrd av "PropertyChanged"), medan "Text"-egenskapen uppdateras fokus flyttas från destinationen (styrd av "LostFocus").

Det normala värdet för egenskapen "UpdateSourceTrigger" är således "Default". Andra möjligheter för egenskapen är PropertyChanged, LostFocus och Explicit. De första två alternativen har vi redan beskrivit medan den sista helt enkelt innebär att uppdateringen måste initieras genom ett "UpdateSource"-anrop.

För att demonstrera hur dessa alternativ fungerar har jag uppdaterat exemplet från föregående kapitel så att det nu innehåller alla tre alternativen.

<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 använder alla textrutorna nu olika UpdateSourceTrigger.

Den första textrutan använder Explicit, vilket innebär att källan inte uppdateras förrän det begärs "manuellt". Därför har jag lagt till en knapp brevid textrutan för uppdatering. En "Click handler" finns nu i c#-koden. Handlern hämtar bindningen från destinationen och utnyttjar denna för att anropa "UpdateSource()"-metoden.

Den andra textrutan utnyttjar LostFocus, vilket är det normala för bindning av text. Källans värde kommer därför att uppdateras så snart destinationskontrollen förlorar fokus.

Slutligen använder den tredje textrutan PropertyChanged. Detta innebär att källans värde uppdateras så snart den bundna egenskapen ändras, vilket händer då texten ändras.

Kör exemplet på din egen dator och studera vad som händer då du ändrar innehållet i de tre textrutorna: En ändring i den första textrutan (fönstrets titel) får ingen effekt förrän du klickar på knappen, en ändring i den andra textrutan får ingen effekt på fönstrets bredd förrän du lämnar textrutan, medan en ändring i den tredje textrutan medför en omedelbar ändring av fönstrets höjd.

Sammanfattning

Egenskapen "UpdateSourceTrigger" hos en bindning styr hur och när ett värde sänds tillbaka till källan. Men eftersom WPF är bra på att sköta denna styrning åt dig, duger det normala värdet bra i de flesta fall och du får då också den bästa kombinationen av användargränssnittets uppdatering och bra prestanda.

I de situationer som kräver större kontroll av vad som händer kan denna egenskap absolut vara till hjälp. Se bara till att du inte uppdaterar källans värde oftare än vad du faktiskt behöver. Om du vill ha full kontroll kan du utnyttja Explicit och sköta uppdateringen manuellt, men då förlorar du lite av det roliga med databindning.


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!