Я хотел бы использовать именованный строковый формат Short Date в WPF.
Я пробовал что-то вроде:
<TextBlock Text="{Binding Date, StringFormat='Short Date'}" />
Как это сделать?
Ответы:
Попробуй это:
<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}" />
Хотя это не позволяет локализовать вывод.
Или используйте это для английского (или смешайте для пользовательского) формата:
StringFormat='{}{0:dd/MM/yyyy}'
Используйте StringFormat
свойство (или ContentStringFormat
на ContentControl
и его производные, например Label
).
<TextBlock Text="{Binding Date, StringFormat={}{0:d}}" />
Обратите внимание, что {}
предшествующая стандарту String.Format
позиционная нотация аргументов позволяет экранировать фигурные скобки в языке расширения разметки.
{}
позволит вам использовать то, StringFormat='{}Created Date:{0:d}'
что в противном случае привело бы к неожиданным результатам.
Некоторые примеры 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
Обратите внимание на одинарные кавычки для формата строки. Это не работает:
Content="{Binding PlannedDateTime, StringFormat={}{0:yy.MM.dd HH:mm}}"
пока это делает:
Content="{Binding PlannedDateTime, StringFormat='{}{0:yy.MM.dd HH:mm}'}"