TOC

This article has been localized into Polish by the community.

Powiązanie danych:

właściwość UpdateSourceTrigger

W poprzednim artykule widzieliśmy w przykładzie, jak zmiany dokonywane w kontrolce typu "TextBox" nie były na bieżąco aktualizowane w kontrolce powiązanej. Aktualizacja taka następowała dopiero w chwili gdy z kontrolki TextBox został przeniesiony fokus na inną kontrolkę. Takie zachowanie jest wynikiem działania właściwości o nazwie UpdateSourceTrigger. Domyślnie jej wartość jest ustawiona w ten sposób, że źródło danych będzie aktualizowane zgodnie ze stanem właściwości, pozostającej z nim w relacji powiązania. Tak więc w naszym przykładzie, podczas wprowadzania tekstu, wszystkie inne właściwości, z wyjątkiem Text, były aktualizowane na bieżąco (PropertyChanged), natomiast właściwość Text była aktualizowana dopiero po zdjęciu fokusu z elementu docelowego.

"Default" oznacza oczywiście wartość domyślną dla właściwości UpdateSourceTrigger. Inne opcjonalne wartości dla tej właściwości to: PropertyChanged, LostFocus i Explicit. Pierwsze dwie zostały już opisane, podczas gdy ostatnia oznacza tyle, że aktualizacja musi zostać ręcznie przekazana, aby wystąpiła przy wywołaniu UpdateSource podczas wiązania za pomocą Binding.

W celu zaprezentowania, jak wszystkie z wyżej wymienionych opcji działają, zaktualizowałem przykład z poprzedniego rozdziału:

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

Jak widzisz, każdy z trzech textboxów, używa teraz różnych wartości dla UpdateSourceTrigger.

Pierwszy z nich jest ustawiony na Explicit, co zasadniczo oznacza, że aktualizacja źródła danych nie będzie odbywać się automatycznie, lecz dopiero w chwili, gdy zostanie zrobione to"ręcznie". Z tego też względu dodałem obok kontrolki typu TextBox dodatkowy przycisk, który po kliknięciu - a więc na żądanie - będzie aktualizował dane. W module kodu, pojawiło się natomiast kilka dodatkowych linii w procedurze obsługi zdarzenia kliknięcia, gdzie powiązano źródło danych z kontrolką docelową, a następnie następuje wywołanie na jej rzecz metody UpdateSource().

Drugi z TextBoxów używa wartości LostFocus, która jest właściwie wartością domyślną dla wiązania typu Text. Oznacza to tyle, że wartość źródłowa będzie aktualizowana za każdym razem, gdy kontrolka docelowa utraci fokus.

Trzeci i ostatni TextBox używa wartości PropertyChanged, która wskazuje, że wartość źródłowa będzie odświeżana, gdy powiązana z nią właściwość także się zmieni, co w tym przykładzie oznacza, każdorazową zmianę tekstu.

Spróbuj uruchomić ten przykład na swojej własnej maszynie, a zobaczysz, jak każdy z tych trzech TextBoxów zachowuje się w zupełnie inny sposób: Pierwsza wartość nie zaktualizuje się zanim nie klikniesz w przyciski, druga wartość nie zmieni się dopóki nie przeniesiesz fokusu, podczas gdy trzecia wartość zmieni się za każdy razem, gdy naciśniesz klawisz, zmienisz tekst, itp.

Podsumowanie

Właściwość powiązania UpdateSourceTrigger kontroluje jak i kiedy zmieniona wartość jest odsyłana z powrotem do swojego źródła. Ponieważ sam WPF sprawuje się nieźle w kontrolowaniu tego wszystkiego, wartość domyślna powinna pozostawać wystarczająca w większości przypadków, w których powinna zostać zachowana najlepsza relacja pomiędzy bieżącym odświeżaniem interfejsu użytkownika (UI) oraz płynnością wykonania tej operacji.

We wszystkich tych sytuacjach, gdzie według Ciebie zaistnieje potrzeba większej kontroli nad procesem, - użycie tej właściwości z pewnością będzie pomocne. Wystarczy jedynie upewnić się, czy istnie konieczność aktualizacji źródła danych częściej niż rzeczywiście potrzeba. Jeśli potrzebujesz pełnej kontroli, możesz użyć wartości Explicit i wówczas dokonać aktualizacji danych ręcznie, ale wówczas ujmuje to nieco z zabawy podczas pracy z wiązaniem danych.

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!