TOC

This article is currently in the process of being translated into Bulgarian (~98% done).

Обвързване на данни:

UpdateSourceTrigger свойството

В по-предишната статия видяхме как промените в TextBox не се отразяват веднага в промяна на стойността при "източника". Вместо това актуализирането се случваше само след загубата на фокуса от TextBox. Това поведение се контролира от свойство на обвързването, наречено UpdateSourceTrigger. По подразбиране стойността му е „Default“, което всъщност означава, че стойността при източника се актуализира въз основа на свойството, към което е обвързано. Към момента на писане всички свойства с изключение на Text свойството, се актуализират веднага щом свойството се промени (PropertyChanged), докато свойството Text се актуализира, когато се загуби фокусът върху целевия елемент (LostFocus).

Default очевидно е стойността по подразбиране на UpdateSourceTrigger. Другите опции са PropertyChanged, LostFocus и Explicit. Първите две вече описахме, докато последната просто означава, че актуализацията трябва да бъде прокарана ръчно, за да бъде отразена, с извикване на UpdateSource на Binding.

За да видите как работят всички тези опции, актуализирах примера от предишната глава, за да покажа всички опции:

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

Както се вижда, всяко от трите текстови полета сега използва различен UpdateSourceTrigger.

Първият е настроен на Explicit, което на практика означава, че източникът няма да бъде актуализиран, освен ако не го направите ръчно. Поради тази причина добавих бутон до TextBox, който ще актуализира изходната стойност при натискването му. В Code-behind ще намерите съответсващия Click метод, където използваме няколко реда код, за да се осъществи обвързването от целевата контрола и след това да извикаме метода UpdateSource() върху него.

Втория TextBox използва стойността LostFocus, която всъщност е по подразбиране за текстово обвързване (обвързване на Text). Това означава, че стойността на източника ще се актуализира всеки път, когато таргетираната контрола загуби фокус.

Третата и последна TextBox контрола използва стойността PropertyChanged, което означава, че стойността на източника ще се актуализира всеки път, когато обвързаното свойство се промени, което се случва в този случай веднага щом текстът се промени.

Опитайте да стартирате примера на вашия компютър и вижте как трите текстови полета действат напълно различно: първата стойност не се актуализира, преди да щракнете върху бутона, втората стойност не се актуализира, докато не напуснете TextBox-а, докато третата стойност се актуализира автоматично при всяко натискане на клавиш, промяна на текст и др.

Обобщение

Свойството UpdateSourceTrigger при обвързване контролира как и кога променената стойност се изпраща обратно към източника. Въпреки това, тъй като WPF е доста добър в контролирането, стойността по подразбиране би трябвало да е подходяща за в повечето случаи и ще получите най-добрата комбинация от постоянно актуализиран потребителски интерфейс (UI) и добра производителност.

За онези ситуации, в които се нуждаете от повече контрол върху процеса, използвайте това свойство. Просто се уверете, че не актуализирате изходната стойност по-често, отколкото всъщност е оптимално необходимо. Ако искате пълен контрол, можете да използвате стойността Explicit и след това да правите актуализациите ръчно, но това отнема малко от забавлението при работата с обвързвания на данни.


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!