This article has been localized into Ukrainian by the community.
Властивість StringFormat
Як ми бачили в попередніх статтях, для того, щоб впливати на вивід прив'язки даних, зазвичай, використовують конвертери. Їх перевагою є можливість конвертувати будь-які типи даних в будь-які інші. Проте, для простіших випадків, коли вам треба лише змінити формат візуалізації, а не тип даних, достатьно скористатися властивість StringFormat.
Використовуючи властивість StringFormat, ви втрачаєте частину гнучкості, яку надає використання конвертерів. Однак разом з тим, ви дуже сильно спрощуєте процес розробки, оскільки вам більше не потрібно створювати новий клас, а разом з ним і новий файл.
Властивість StringFormat робить саме те, що випливає з її назви. Вона форматує рядок виводу, просто, викликаючи метод String.Format. Інколи приклад говорить більше ніж тисяча слів, тож давайте поглянемо на нього:
<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>
Перші два елементи TextBlock беруть свої значення, прив'язуючи ширину та висоту батьківського вікна, Значення форматуються завдяки властивості StringFormat. Для ширини ми використовуємо спеціальний формат, а для висоти - грошовий формат. Значення зберігається у форматі double. Тож ми використовуємо ту саму специфікацію формату, що й при виклику double.ToString(). Ви можете знайтти їхній список тут: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx.
Крім того запам'ятайте, як можна включити специфічний текст в StringFormat - це дозволить вам додати будь-який текст на початку чи в кінці значення. При посиланні на фактичне значення всередині рядка формату, ми оточуємо його фігурними дужками, що містять два значення: посилання на значення, яке ми хочемо відформатувати (0 - це перший можливий номер значення) та рядок формату, розділені двокрапкою.
Останні два значення прив'язуються до поточної дати (DateTime.Now). Перший вивід - це власне дата, а другий - це час (години та хвилини). Тут можна прочитати більше про форматування DateTime : http://msdn.microsoft.com/en-us/library/az4se3k1.aspx.
Форматування без додаткового тексту
Запам'ятайте: якщо ви використовуєте формат рядка, що не містить жодного додаткового тексту, як от у всіх прикладах вище, то вам слід додати ще один набір фігурних дужок в XAML розмітку. Причина в тому, що інакше WPF може сплутати синтаксис із тим, який використовується для розширень розмітки. Ось приклад:
<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>
Використання специфічної культури
Якщо вам потрібно виводити прив'язану властивість по-різному, в залежності від культури, то це не проблема. Прив'язка використовує мову, вибрану для батьківського елемента, однак її можна задати безпосередньо для неї, використовуючи властивість ConverterCulture. Ось приклад:
<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>
Тут все дуже просто: завдяки поєднанню властивості StringFormat, яка використовує специфікатор D (шаблон довгого запису дати), та властивості ConverterCulture , ми можемо виводити прив'язані значення по-різному, в залежності від вибраної культури.