This article has been localized into Vietnamese by the community.
Thuộc tính StringFormat
Như chúng ta đã thấy trong các chương trước, cách thao tác đầu ra của một ràng buộc trước khi nó được hiển thị thường thông qua việc sử dụng một trình chuyển đổi. Điều thú vị về các bộ chuyển đổi là chúng cho phép bạn chuyển đổi bất kỳ loại dữ liệu nào thành một loại dữ liệu hoàn toàn khác. Tuy nhiên, đối với các kịch bản sử dụng đơn giản hơn, trong đó bạn chỉ muốn thay đổi cách hiển thị một giá trị nhất định và không nhất thiết phải chuyển đổi nó thành một loại khác, thuộc tính StringFormat rất có thể là đủ.
Sử dụng thuộc tính StringFormat của một ràng buộc, bạn sẽ mất một số tính linh hoạt khi sử dụng trình chuyển đổi, nhưng bù lại, việc sử dụng đơn giản hơn nhiều và không liên quan đến việc tạo một lớp mới trong một tệp mới.
Thuộc tính StringFormat thực hiện chính xác những gì tên gọi: Nó định dạng chuỗi đầu ra, chỉ đơn giản bằng cách gọi phương thức String.Format. Đôi khi một ví dụ nói hơn một ngàn từ, vì vậy trước khi tôi nhấn số từ đó, hãy nhảy thẳng vào một ví dụ:
<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="StringFormatSample" Height="150" Width="250"
Name="wnd">
<StackPanel Margin="10">
<TextBlock Text="{Binding ElementName=wnd, Path=ActualWidth, StringFormat=Window width: {0:#,#.0}}" />
<TextBlock Text="{Binding ElementName=wnd, Path=ActualHeight, StringFormat=Window height: {0:C}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Date: {0:dddd, MMMM dd}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Time: {0:HH:mm}}" />
</StackPanel>
</Window>
Cặp đôi đầu tiên của TextBlock nhận được giá trị của chúng bằng cách liên kết với Window và lấy chiều rộng và chiều cao của nó. Thông qua thuộc tính StringFormat, các giá trị được định dạng. Đối với chiều rộng, chúng tôi chỉ định một chuỗi định dạng tùy chỉnh và đối với chiều cao, chúng tôi yêu cầu nó sử dụng định dạng tiền tệ, chỉ để cho vui. Giá trị được lưu dưới dạng double, vì vậy chúng ta có thể sử dụng tất cả các chỉ định định dạng giống như khi chúng ta gọi là double.ToString(). Bạn có thể tìm thấy một danh sách của họ ở đây: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Cũng lưu ý cách tôi có thể bao gồm văn bản tùy chỉnh trong StringFormat - điều này cho phép bạn sửa / sửa lỗi giá trị ràng buộc với văn bản theo ý muốn. Khi tham chiếu giá trị thực bên trong chuỗi định dạng, chúng tôi bao quanh nó bằng một tập các dấu ngoặc nhọn, bao gồm hai giá trị: Tham chiếu đến giá trị chúng tôi muốn định dạng (giá trị số 0, là giá trị đầu tiên có thể) và chuỗi định dạng , cách nhau bởi một dấu hai chấm.
Đối với hai giá trị cuối cùng, chúng tôi chỉ cần liên kết với ngày hiện tại (DateTime.Now) và đầu ra đầu tiên dưới dạng ngày, theo định dạng cụ thể và sau đó là thời gian (giờ và phút), một lần nữa bằng cách sử dụng chính StringFormat, trước đó định dạng xác định. Bạn có thể đọc thêm về định dạng DateTime tại đây: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx
Định dạng mà không cần thêm văn bản
Xin lưu ý rằng nếu bạn chỉ định một chuỗi định dạng không bao gồm bất kỳ văn bản tùy chỉnh nào, mà tất cả các ví dụ trên có, thì bạn cần thêm một bộ dấu ngoặc nhọn, khi xác định nó trong XAML. Lý do là WPF có thể nhầm lẫn cú pháp với cú pháp được sử dụng cho Markup Extensions. Đây là một ví dụ:
<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="StringFormatSample" Height="150" Width="250"
Name="wnd">
<WrapPanel Margin="10">
<TextBlock Text="Width: " />
<TextBlock Text="{Binding ElementName=wnd, Path=ActualWidth, StringFormat={}{0:#,#.0}}" />
</WrapPanel>
</Window>
Sử dụng Specific culture
Nếu bạn cần xuất giá trị ràng buộc theo specific culture, điều đó không có vấn đề gì. Binding sẽ sử dụng ngôn ngữ được chỉ định cho phần tử cha hoặc bạn có thể chỉ định nó trực tiếp cho liên kết, sử dụng thuộc tính ConverterCARM. Đây là một ví dụ:
<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatCultureSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="StringFormatCultureSample" Height="120" Width="300">
<StackPanel Margin="10">
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='de-DE', StringFormat=German date: {0:D}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='en-US', StringFormat=American date: {0:D}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='ja-JP', StringFormat=Japanese date: {0:D}}" />
</StackPanel>
</Window>
Điều này khá đơn giản: Bằng cách kết hợp thuộc tính StringFormat, sử dụng công cụ xác định D (mẫu ngày dài) và thuộc tính ConverterCARM, chúng ta có thể xuất các giá trị ràng buộc theo văn hóa cụ thể. Khá tiện lợi!