XAML и Data Binding: еще раз про StringFormat

ru-RU | создано: 12.05.2011 | опубликовано: 12.05.2011 | обновлено: 01.01.2018 | просмотров за всё время: 19281

С своей предыдущей статье, которая рассказывала про связывание данных (Data Binding) я немного упомянул про один из параметров, который называется StringFormat. В этой статье я хотел бы остановиться на применении этого параметра подробнее. И привести некоторые полезные примеры и ссылки.

StringFormat и строки

Казалось бы, какие могут быть особенности при связывании строки в XAML. А ведь есть. Даже, по правде сказать, не столько “особенности”, сколько “полезности”. Итак, поехали. Давайте на форму поместим какой-нибудь контрол, как предмет для издевательств, а далее просто примеры применения.

<TextBlock x:Name="userControl" Text="Полезный параметр StringFormat"/>

Пример 1: Связывание произойдет и строка будет содержать как минимум 15 символов. Дополнительные (недостающие до 15) символы пробелов будут подставлены с начала и с конца строки.

<TextBlock Text="{Binding Text, StringFormat=\{0\,15\}, ElementName=userControl}"/>

Пример 2: Связывание произойдет и строка будет содержать как минимум 25 символов. Дополнительные (недостающие до 25) символы пробелов будут подставлены с начала и с конца строки.

<TextBlock Text="{Binding Text, StringFormat=\{0\,25\}, ElementName=userControl}"/>

Пример 3: Значение свойства Text контрола userControl будет являться цитатой, то есть будет отображено в кавычках.

<TextBlock Text="{Binding Text, 
          StringFormat='Цитата &quot;\{0\}&quot; в кавычках', 
          ElementName=userControl}"/>

StringFormat и цифры

Формат вывода цифр тоже можно контролировать. Опять же просто приведу примеры, потому как именно по этой причине мы тут и собрались. Итак, у нас есть:

<TextBlock x:Name="userControl" Text="[какое-то double значение]" />

ПримечаниеЕсли просто написать вместо [какое-то double значение], то оно воспримется как текст, поэтому важно именно привязать (через Binding) это значение.

Пример 4: Если double значение равно 1123,123203574932, то следующий формат покажет два символа после разделителя.

<TextBlock Text="{Binding StringFormat=\{0:n2\}, ElementName=userControl, Path=Text}" />

Пример 5: Если double значение равно 1123,123203574932, то следующий формат покажет четыре символа после разделителя.

<TextBlock Text="{Binding StringFormat=\{0:n4\}, ElementName=userControl, Path=Text}" />

Пример 6: Если double значение равно 1123,123203574932, то следующий формат покажет 0000001123, при этом “отбросит” дробную часть.

<TextBlock Text="{Binding StringFormat=\{0:0000000000\}, ElementName=userControl, Path=Text}" />

StringFormat и денежный формат

Отображение типа валюты зависит от конкретно локализации. Все форматы перечислены в MSDN. Осмелюсь предположить, что вы используете ru_RU. А значить примеры следующих форматов покажут “руб.” после цифр. Снова нужен подопытный контрол.

<TextBlock x:Name="userControl" Text="[какое-то double значение]" />

ПримечаниеЕсли просто написать вместо [какое-то double значение], то оно воспримется как текст, поэтому важно именно привязать (через Binding) это значение.

Пример 7: Если в Text подопытного контрола забиндить значение 6569,435215905 то следующий формат отобразить только рубли: 6569р.

<TextBlock Text="{Binding StringFormat=\{0:c0\}, ElementName=userControl, Path=Text}" />

Пример 8: Если в Text подопытного контрола забиндить значение 6569,435215905 то следующий формат отобразить только рубли: 6569,44р.

<TextBlock Text="{Binding StringFormat=\{0:c2\}, ElementName=userControl, Path=Text}" />

При этом применится округление.

StringFormat и Дата (DataTime)

Форматом отображения даты и времени тоже можно управлять. Вот примеры.

Пример 9: Полный формат даты и времени (время без секунд), результат: 13 мая 2011 г. 10:42

<TextBlock Text="{Binding StringFormat=f, ElementName=userControl, Path=Text}" />

Пример 10: Полный формат даты и времени (время с секундами), результат: 13 мая 2011 г. 10:43:24

<TextBlock Text="{Binding StringFormat=F, ElementName=userControl, Path=Text}" />

Пример 11: Сокращенный формат даты и времени (время без секунд), результат: 13.05.2011 г. 10:44

<TextBlock Text="{Binding StringFormat=g, ElementName=userControl, Path=Text}" />

Пример 12: Сокращенный формат даты и времени (время с секундами), результат: 13.05.2011 г. 10:45:34

<TextBlock Text="{Binding StringFormat=G, ElementName=userControl, Path=Text}" />

ПримечаниеОднако, опять же стоит забывать, что значение с которым производится манипуляции должно быть именно DateTime, иначе оно воспримется как текст и форматирования не будет.

Удачи в кодировании.

Ссылки в статье:

Комментарии к статье (4)

24.07.2011 16:43:00 Константин

Можно ли при помощи StringFormat отформатировать денежную сумму в рублях для отображения в тысячах рублей:
например 6569,435215905 --> 6,6 т.р. ?

20.05.2017 15:20:01 Calabonga

Денежную сумму отформатировать можно, и для этого надо применить следующий формат:

StringFormat=\{0:C\}


Но сумма будет оторбражать стандарный вид денежного выражения (в зависимости от локализации). То что желаете сделать Вы, Константин, можно сделать, например, при помощи конвертера. А при помощи StringFormat этого сделать нельзя.

02.08.2011 14:20:00 Константин

У корпорации Microsoft имеется альтернативное мнение: http://msdn.microsoft.com/ru-ru/library/0c899ak8.aspx#SpecifierTh

21.08.2011 6:05:00 Константин

И никаких конвертеров не требуется.