WPF Binding StringFormat Short Date String

88

Eu gostaria de usar o formato de string chamado Short Date no WPF.

Eu tentei algo como:

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

Como fazer isso?

Tony
fonte

Respostas:

176

Experimente isto:

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

que é sensível à cultura e requer .NET 3.5 SP1 ou superior.

NOTA: Isso diferencia maiúsculas de minúsculas. "d" é o especificador de formato de data abreviada, enquanto "D" é o especificador de formato de data longo .

Há uma lista completa de formatos de string na página do MSDN em Strings de formato padrão de data e hora e uma explicação mais completa de todas as opções nesta postagem do blog do MSDN

No entanto, há uma pegadinha com isso - ele sempre exibe a data no formato dos EUA, a menos que você mesmo defina a cultura para o valor correto.

Se você não definir essa propriedade, o mecanismo de vinculação usará a propriedade Language do objeto de destino da vinculação. Em XAML, o padrão é "en-US" ou herda o valor do elemento raiz (ou qualquer elemento) da página, se um tiver sido definido explicitamente.

Fonte

Uma maneira de fazer isso é no código por trás (supondo que você definiu a cultura do thread com o valor correto):

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

A outra maneira é definir a cultura do conversor na ligação:

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

Embora isso não permita que você localize a saída.

ChrisF
fonte
Obrigado! Você entendeu! Quando perguntei, tinha em mente qual era o formato de string de data abreviada, onde poderia encontrar a lista de formatos de string, e também gostei que você respondeu com StringFormat = d. Muito claro e completo.
Tony
isso sempre exibe o formato dos EUA, independentemente das configurações de cultura?
CRice de
@CRice - sim, é verdade - por algum motivo - você mesmo definiu a cultura.
ChrisF
1
Obrigado, muito ruim quando a IU "d" produz resultados diferentes para xaml.cs "d" do mesmo objeto de data.
CRice de
ref o bug da cultura WPF, acabei de adicionar this.Language = System.Windows.Markup.XmlLanguage.GetLanguage (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag); após inicializar o componente em cada janela;
peterG
51

Ou use para um formato em inglês (ou misture para customizar):

StringFormat='{}{0:dd/MM/yyyy}'
outro
fonte
2
Você também pode usar 'ConverterCulture =' em sua vinculação - o que requer um valor para indicar o formato. (ConverterCulture = 'en-GB' é Grã-Bretanha).
outro dia
esta é a melhor e mais fácil resposta para o problema
Steven
Saúde, Steven! Eu também venci a resposta "vencedora" do add-on ConverterCulture ... mas que seja.
outra coisa de
27

Use a StringFormatpropriedade (ou ContentStringFormatem ContentControle seus derivados, por exemplo Label).

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

Observe {}que a String.Formatnotação anterior à notação de argumento posicional padrão permite que as chaves sejam escapadas na linguagem de extensão de marcação.

user7116
fonte
4
O {}permitirá que você use o StringFormat='{}Created Date:{0:d}'que, de outra forma, produziria resultados inesperados.
Monstro acastanhado
11

Alguns exemplos de DateTime StringFormat que achei úteis. Exemplos tirados de 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
Telos
fonte
4

Apenas use:

<TextBlock Text="{Binding Date, StringFormat=\{0:d\}}" />
as-cii
fonte
4

Se você quiser adicionar uma string com o valor, use isto:

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

Esteja ciente das aspas simples para o formato da string. Isso não funciona:

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

enquanto isso faz:

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