TOC

This article has been localized into Russian by the community.

Связывание данных:

Свойство UpdateSourceTrigger

В предыдущей статье мы увидели, как изменения текста в элементе TextBox не повлекло немедленного соответствующего изменения в источнике данных. Вместо этого источник данных обновился только после того, как элемент TextBox потерял фокус. Такое поведение контролируется свойством под названием UpdateSourceTrigger при связывании целевого свойства и источника. По умолчанию это свойство имеет значение "Default", которое означает, что изменение источника будет зависеть от целевого свойства от которого идет привязка. На момент написания этой статьи, все свойства, исключая свойство Text, будут немедленно обновлены при изменении источника данных, в то время как свойство Text изменится лишь при потере фокуса элементом управления.

"Default" является значением по умолчанию свойства UpdateSourceTrigger. Другими значениями могут быть PropertyChanged, LostFocus и Explicit. Первые два уже были описаны, последнее означает, что обновление источника произойдет только при вызове метода UpdateSource().

Чтобы показать как эти опции работают я обновил пример из предыдущей главы.

<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, которая обновляет источник при нажатии. В исходниках вы можете найти обработчик события нажатия кнопки, где несколько строк кода используются для получения объекта типа BindingExpression и вызова метода UpdateSource() этого объекта.

Второй TextBox использует значение LostFocus, которое является значением по умолчанию при связывании свойства Text с источником. Это означает, что источник будет обновляться каждый раз, когда целевой элемент управления потеряет фокус.

В последнем третьем TextBox используется значение PropertyChanged, которое означает, что изменение источника произойдет всякий раз при изменении целевого свойства. В нашем случае при изменении текста в TextBox.

Попробуйте запустить пример на вашей машине и посмотрите, как по-разному работают TextBox при изменении текста. В первом случае значение не изменится пока вы не нажмете кнопку, во втором случае значение не изменится пока TextBox не потеряет фокус управления, в третьем случае значение изменится сразу же при изменении текста.

Резюме

Свойство UpdateSourceTrigger контролирует, как и когда изменения в целевом свойстве спровоцируют изменения в источнике. Однако, в большинстве случаев, значение по умолчанию этого свойства является лучшим выбором соотношения обновления пользовательского интерфейса и производительности.

Для тех ситуаций, когда вам нужно контролировать этот процесс, это свойство достаточно полезно. Только будьте уверены в том, что вы не обновляете источник привязки чаще, чем того требуется. Для получения полного контроля можно использовать значение 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!