WPF Binding StringFormat Краткая строка даты

89

Я хотел бы использовать именованный строковый формат Short Date в WPF.

Я пробовал что-то вроде:

<TextBlock Text="{Binding Date, StringFormat='Short Date'}" />

Как это сделать?

Тони
источник

Ответы:

177

Попробуй это:

<TextBlock Text="{Binding PropertyPath, StringFormat=d}" />

который является чувствительным к культуре и требует .NET 3.5 SP1 или выше.

ПРИМЕЧАНИЕ. Это чувствительно к регистру. «d» - это описатель короткого формата даты, а «D» - описатель длинного формата даты .

На странице MSDN есть полный список строковых форматов, посвященных строкам стандартного формата даты и времени, и более полное объяснение всех параметров в этом сообщении блога MSDN.

Однако с этим есть одна проблема - он всегда выводит дату в формате США, если вы сами не установите правильное значение для культуры.

Если это свойство не задано, механизм привязки использует свойство Language целевого объекта привязки. В XAML это значение по умолчанию «en-US» или наследует значение от корневого элемента (или любого элемента) страницы, если он был явно установлен.

Источник

Один из способов сделать это - использовать код (при условии, что вы установили правильное значение для культуры потока):

this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);

Другой способ - установить культуру конвертера в привязке:

<TextBlock Text="{Binding PropertyPath, StringFormat=d, ConverterCulture=en-GB}" />

Хотя это не позволяет локализовать вывод.

ChrisF
источник
Спасибо! Ты получил это! Когда я спросил, я имел в виду, что такое строковый формат Short Date, где я могу найти список строковых форматов, а также мне понравилось, что вы ответили StringFormat = d. Очень ясно и полно.
Тони
всегда ли выводится формат США независимо от настроек культуры?
CRice
@CRice - да, по какой-то причине - вы сами установили культуру.
ChrisF
1
Спасибо, очень плохо, когда пользовательский интерфейс «d» выводит отличные от xaml.cs «d» того же объекта даты.
CRice
для исправления ошибки культуры WPF я просто добавляю this.Language = System.Windows.Markup.XmlLanguage.GetLanguage (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag); после инициализации компонента в каждом окне;
peterG
54

Или используйте это для английского (или смешайте для пользовательского) формата:

StringFormat='{}{0:dd/MM/yyyy}'
еще
источник
2
Вы также можете использовать ConverterCulture = в своей привязке, для которой требуется значение для указания формата. (ConverterCulture = 'en-GB' - Великобритания).
еще
это лучший и самый простой ответ на проблему
Стивен
Ура, Стивен! Я также побил "выигрышный" ответ надстройки ConverterCulture ... но пусть будет так.
else
28

Используйте StringFormatсвойство (или ContentStringFormatна ContentControlи его производные, например Label).

<TextBlock Text="{Binding Date, StringFormat={}{0:d}}" />

Обратите внимание, что {}предшествующая стандарту String.Formatпозиционная нотация аргументов позволяет экранировать фигурные скобки в языке расширения разметки.

user7116
источник
4
Это {}позволит вам использовать то, StringFormat='{}Created Date:{0:d}'что в противном случае привело бы к неожиданным результатам.
Brownish Monster
13

Некоторые примеры DateTime StringFormat, которые я нашел полезными. Заимствовано из примеров C #

DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);

String.Format("{0:y yy yyy yyyy}", dt);  // "8 08 008 2008"   year
String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar March"  month
String.Format("{0:d dd ddd dddd}", dt);  // "9 09 Sun Sunday" day
String.Format("{0:h hh H HH}",     dt);  // "4 04 16 16"      hour 12/24
String.Format("{0:m mm}",          dt);  // "5 05"            minute
String.Format("{0:s ss}",          dt);  // "7 07"            second
String.Format("{0:f ff fff ffff}", dt);  // "1 12 123 1230"   sec.fraction
String.Format("{0:F FF FFF FFFF}", dt);  // "1 12 123 123"    without zeroes
String.Format("{0:t tt}",          dt);  // "P PM"            A.M. or P.M.
String.Format("{0:z zz zzz}",      dt);  // "-6 -06 -06:00"   time zone
Телос
источник
5

Если вы хотите добавить строку со значением, используйте это:

<TextBlock Text="{Binding Date, StringFormat= 'Date : {0:d}'}" />
Анураг
источник
5

Обратите внимание на одинарные кавычки для формата строки. Это не работает:

    Content="{Binding PlannedDateTime, StringFormat={}{0:yy.MM.dd HH:mm}}"

пока это делает:

    Content="{Binding PlannedDateTime, StringFormat='{}{0:yy.MM.dd HH:mm}'}"
pawellipowczan
источник
4

Просто используйте:

<TextBlock Text="{Binding Date, StringFormat=\{0:d\}}" />
as-cii
источник