This article has been localized into Russian 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.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, мы можем выводить связанные значения в соответствии с определенной культурой. Довольно изящно!