TOC

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

Data binding:

Chuyển đổi giá trị với IValueConverter

Cho đến nay chúng tôi đã sử dụng một số ràng buộc dữ liệu đơn giản, trong đó thuộc tính gửi và nhận luôn tương thích. Tuy nhiên, bạn sẽ sớm gặp phải tình huống bạn muốn sử dụng một giá trị ràng buộc của một loại và sau đó trình bày nó một chút khác nhau.

Khi nào nên sử dụng bộ chuyển đổi giá trị

Bộ chuyển đổi giá trị được sử dụng rất thường xuyên với các ràng buộc dữ liệu. Dưới đây là một số ví dụ cơ bản:

  • Bạn có một giá trị số nhưng bạn muốn hiển thị giá trị 0 theo một cách và số dương theo cách khác
  • Bạn muốn kiểm tra một CheckBox dựa trên một giá trị, nhưng giá trị là một chuỗi như "yes" hoặc "no" thay vì giá trị Boolean
  • Bạn có kích thước tệp theo byte nhưng bạn muốn hiển thị dưới dạng byte, kilobyte, megabyte hoặc gigabyte dựa trên mức độ lớn của nó

Đây là một số trường hợp đơn giản, nhưng có nhiều trường hợp khác. Chẳng hạn, bạn có thể muốn kiểm tra hộp kiểm dựa trên giá trị Boolean, nhưng bạn muốn nó đảo ngược, để CheckBox được kiểm tra nếu giá trị sai và không được kiểm tra nếu giá trị là đúng. Thậm chí, bạn có thể sử dụng trình chuyển đổi để tạo hình ảnh cho ImageSource, dựa trên giá trị, như dấu màu xanh là đúng hoặc dấu đỏ cho sai - khả năng là vô tận!

Đối với những trường hợp như thế này, bạn có thể sử dụng một công cụ chuyển đổi giá trị. Trong các lớp nhỏ này với việc sử dụng IValueConverter, nó sẽ hoạt động như người trung gian và dịch một giá trị giữa nguồn và đích. Vì vậy, trong mọi trường hợp bạn cần chuyển đổi một giá trị trước khi đến đích hoặc quay lại nguồn của nó, bạn có thể cần một trình chuyển đổi.

Thực hiện một công cụ chuyển đổi giá trị đơn giản

Như đã đề cập, trình chuyển đổi giá trị WPF cần triển khai IValueConverter interface hoặc IMultiValueConverter interface (sẽ nói thêm về interface đó sau). Cả hai interface chỉ yêu cầu bạn thực hiện hai phương thức: Convert () và ConvertBack (). Như tên ngụ ý, các phương thức này sẽ được sử dụng để chuyển đổi giá trị sang định dạng đích và sau đó quay lại.

Chúng ta hãy thực hiện một trình chuyển đổi đơn giản lấy một chuỗi làm đầu vào và sau đó trả về giá trị Boolean, cũng như cách khác. Nếu bạn chưa quen với WPF và có thể bạn đang đọc hướng dẫn này, thì bạn có thể không biết tất cả các khái niệm được sử dụng trong ví dụ, nhưng đừng lo, tất cả chúng sẽ được giải thích sau danh sách code dưới đây:

<Window x:Class="WpfTutorialSamples.DataBinding.ConverterSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:local="clr-namespace:WpfTutorialSamples.DataBinding"
        Title="ConverterSample" Height="140" Width="250">
	<Window.Resources>
		<local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" />
	</Window.Resources>
	<StackPanel Margin="10">
		<TextBox Name="txtValue" />
		<WrapPanel Margin="0,10">
			<TextBlock Text="Current value is: " />
			<TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock>
		</WrapPanel>
		<CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" />
	</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Data;

namespace WpfTutorialSamples.DataBinding
{
	public partial class ConverterSample : Window
	{
		public ConverterSample()
		{
			InitializeComponent();
		}
	}

	public class YesNoToBooleanConverter : IValueConverter
	{
		public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
		{
			switch(value.ToString().ToLower())
			{
				case "yes":
				case "oui":
					return true;
				case "no":
				case "non":
					return false;
			}
			return false;
		}

		public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
		{
			if(value is bool)
			{
				if((bool)value == true)
					return "yes";
				else
					return "no";
			}
			return "no";
		}
	}
}

Code-behind

Vì vậy, hãy bắt đầu từ phía sau và sau đó làm việc theo cách của chúng tôi thông qua ví dụ. Chúng tôi đã triển khai một trình chuyển đổi trong tệp Code-behind có tên YesNoToBooleanConverter. Như đã quảng cáo, nó chỉ thực hiện hai phương thức cần thiết, được gọi là Convert () và ConvertBack (). Các phương thức Convert () giả định rằng nó nhận được một chuỗi làm đầu vào (tham số giá trị) và sau đó chuyển đổi nó thành giá trị Boolean đúng hoặc sai, với giá trị dự phòng là sai. Để giải trí, tôi cũng đã thêm khả năng thực hiện chuyển đổi này từ các từ tiếng Pháp ("oui" và "non").

Phương thức ConvertBack() rõ ràng làm ngược lại: Nó giả sử một giá trị đầu vào với loại Boolean và sau đó trả về từ tiếng Anh "yes" hoặc "no", với giá trị return là "no".

You may wonder about the additional parameters that these two methods take, but they're not needed in this example. We'll use them in one of the next chapters, where they will be explained.

XAML

Trong phần XAML của chương trình, chúng tôi bắt đầu bằng cách khai báo một thể hiện của trình chuyển đổi của chúng tôi làm tài nguyên cho cửa sổ. Sau đó, chúng tôi có một TextBox, một vài điều khiển TextBlocks và CheckBox và đây là nơi xảy ra những điều thú vị: Chúng tôi liên kết giá trị của TextBox với TextBlock và điều khiển CheckBox và sử dụng thuộc tính Trình chuyển đổi và tham chiếu trình chuyển đổi của riêng chúng tôi, chúng tôi sắp xếp các giá trị qua lại giữa một chuỗi và giá trị Boolean, tùy thuộc vào những gì cần thiết.

Nếu bạn cố chạy ví dụ này, bạn sẽ có thể thay đổi giá trị ở hai vị trí: Bằng cách viết "yes" trong TextBox (hoặc bất kỳ giá trị nào khác, nếu bạn muốn false) hoặc bằng cách check vào CheckBox. Bất kể bạn làm gì, thay đổi sẽ được phản ánh trong điều khiển khác cũng như trong TextBlock.

Tóm lại

Đây là một ví dụ về trình chuyển đổi giá trị đơn giản, được thực hiện lâu hơn một chút so với mức cần thiết cho mục đích minh họa. Trong chương tiếp theo, chúng ta sẽ xem xét một ví dụ nâng cao hơn, nhưng trước khi bạn ra ngoài và viết trình chuyển đổi của riêng mình, bạn có thể muốn kiểm tra xem WPF đã bao gồm một mục đích chưa. Khi viết, có hơn 20 bộ chuyển đổi tích hợp mà bạn có thể tận dụng, nhưng bạn cần biết tên của chúng. Tôi tìm thấy danh sách sau đây có thể hữu ích cho bạn: http://stackoverflow.com/questions/505397/built-in-wpf-ivalueconverters

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!