XAML и Data Binding: еще раз про StringFormat
WPF, MVVM, Silverlight | создано: 12.05.2011 | опубликовано: 12.05.2011 | обновлено: 13.01.2024 | просмотров: 25187 | всего комментариев: 4
С своей предыдущей статье, которая рассказывала про связывание данных (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='Цитата "\{0\}" в кавычках', 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)
Можно ли при помощи StringFormat отформатировать денежную сумму в рублях для отображения в тысячах рублей:
например 6569,435215905 --> 6,6 т.р. ?
Денежную сумму отформатировать можно, и для этого надо применить следующий формат:
StringFormat=\{0:C\}
Но сумма будет оторбражать стандарный вид денежного выражения (в зависимости от локализации). То что желаете сделать Вы, Константин, можно сделать, например, при помощи конвертера. А при помощи StringFormat этого сделать нельзя.
У корпорации Microsoft имеется альтернативное мнение: http://msdn.microsoft.com/ru-ru/library/0c899ak8.aspx#SpecifierTh
И никаких конвертеров не требуется.