TOC

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

Data binding:

Phương thức UpdateSourceTrigger

Trong bài viết trước chúng ta đã biết tại sao những thay đổi trên 1 TextBox thì không trực tiếp gởi trở lại nguồn. Thay vào đó, nguồn chỉ được cập nhật sau khi con trỏ dịch chuyển khỏi TextBox. Hành vi này được điều khiển thông qua thuộc tính trong binding gọi là UpdateSourceTrigger. Nó mặc định giá trị là "Default", cơ bản nghĩa là nguồn được cập nhật dựa trên thuộc tính bạn bind tới. Như việc viết, tất cả thuộc tính ngoại trừ Text, thì được cập nhật ngay khi thuộc tính này thay đổi (PropertyChanged), trong khi thuộc tính Text thì được cập nhật khi con trỏ rời khỏi phần tử đích (LostFocus).

Default hiển nhiên là giá trị mặc định của UpdateSourceTrigger. Những lựa chọn khác PropertyChanged, LostFocusExplicit. Hai giá trị đầu tiên đã được mô tả rồi, trong khi giá trị cuối đơn giản nghĩa là việc cập nhật phải được thực thi khi lệnh gọi bằng tay xảy ra, sử dụng bằng cách gọi UpdateSource trên đối tượng Binding.

Để thấy tất cả những lựa chọn hoạt động thế nào, tôi đã cập nhật ví dụ trong chương trước để bạn thấy tất cả chúng:

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

Như bạn có thể thấy, mỗi một trong ba textbox bây giờ sử dụng những UpdateSourceTrigger khác nhau.

Phần tử đầu tiên thiết lập Explicit, cơ bản nghĩa là nguồn sẽ không được cập nhật trừ phi bạn thực hiện bằng tay. Vì lý do này, tôi phải thêm 1 button kế bên TextBox, nó sẽ thực hiện cập nhật trên giá trị nguồn theo yêu cầu. Trong Code-behind, bạn sẽ bắt gặp Click handler, nơi mà chúng ta sử dụng một vài dòng code để có binding từ control đích và gọi phương thức UpdateSource() trên nó.

TextBox thứ hai sử dụng giá trị LostFocus, đây thực tế là giá trị mặc định của 1 Text bidning. Nó nghĩa là giá trị nguồn sẽ được cập nhật mỗi lần con trỏ rồi khỏi control đích .

TextBox thứ ba và TextBox cuối sử dụng giá trị PropertyChanged, có nghĩa là giá trị nguồn sẽ được cập nhật mỗi lần thuộc tính bound thay đổi, nó được thực thi ngay khi text thay đổi.

Thử chạy ví dụ trên máy của bạn và xem cách 3 textbox hành động hoàn toàn khác nhau: Textbox đầu tiên không cập nhật cho đến khi bạn nhấp chuột vào button, cái thứ hai sẽ không cập nhật cho đến khi bạn rời khỏi TextBox, trong khi giá trị thứ ba cập nhật tự động mỗi khi bạn gõ phím, text thay đổi v.v...

Tóm tắt

Thuộc tính UpdateSourceTrigger của 1 binding điều khiển bằng cách nào và khi nào một giá trị thay đổi gởi ngược lại phần tử nguồn. Tuy nhiên, vì WPF rất tốt trong việc xử lý việc này cho bạn nên giá trị mặc định là đủ cho hầu hết các trường hợp khi bạn muốn có sự pha trộn của một UI được cập nhật thường xuyên và thực thi tốt.

Trong những trường hợp mà bạn cần nhiều control trong tiến trình, thuộc tính này sẽ rất hữu ích. Chỉ là phải bảo đảm rằng bạn không cập nhật giá trị nguồn thường xuyên hơn mức cần thiết tực tế. Nếu bạn muốn hoàn toàn điều khiển, bạn có thể sử dụng giá trị Explicit và sau đó tự cập nhật bằng tay, nhưng điều này mang đến niềm vui ngoài việc bind dữ liệu.

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!