TOC

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

Data binding:

The UpdateSourceTrigger property

В попередній статті ми бачили як зміни у TextBox'і не були одразу передані до джерела. Натомість Textbox був оновлений тільки після того як з нього було знято фокус. Ця поведінка контролюється властивістю прив'язки яка називається UpdateSourceTrigger. По замовчуванню він має значення "Default", що в основному означає що оновлення джерела базується на основі властивості до якої ви прив'язуєтеся. Після запису всіх властивостей окрім Text, оновлення відбувається як тільки змінюється властивість (PropertyChange), а властивість Text оновлюється як тільки фокус з елемента зникає.

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

Як ви можете бачити що кожен з трьох TextBox'ів зараз використовує різний UpdateSourceTrigger.

Перший з них встановлений на Explicit, що означає що джерело не буде оновлене, якщо це не зробити вручну. З цієї причини я додав кнопку поруч з TextBox'ом, яка буде оновлювати значення на вимогу. В кодбехайнді, ви знайдете обробник Click, де ми використовуємо кілька рядків коду щоб прив'язати контрол а потім викликати метод UpdateSource() для нього.

Другий TextBox використовує значення LostFocus яке є типовим для прив'язки тексту. Це означає що значення джерела оновлюватиметься кожного разу, коли контрол втрачає фокус

The third and last TextBox uses the PropertyChanged value, which means that the source value will be updated each time the bound property changes, which it does in this case as soon as the text changes.

Спробуйте виконати цей приклад на вашому комп'ютері і подивіться як три TextBox'и відрізняються одне від одного. Перший не зміниться поки не натиснете на кнопку, друге значення не оновлюється поки ви не залишите TextBox, в той час як третє значення оновлюється автоматично як тільки текст змінюється.

Summary

Властивість 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!