WPF Binding StringFormat Stringa di data breve


89

Vorrei utilizzare il formato stringa denominato Data breve in WPF.

Ho provato qualcosa del tipo:

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

Come fare questo?

Risposte:


177

Prova questo:

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

che è sensibile alle impostazioni cultura e richiede .NET 3.5 SP1 o versione successiva.

NOTA: fa distinzione tra maiuscole e minuscole. "d" è l' identificatore di formato della data breve mentre "D" è l' identificatore di formato della data lunga .

C'è un elenco completo del formato di stringa nella pagina MSDN sulle stringhe di formato di data e ora standard e una spiegazione più completa di tutte le opzioni in questo post del blog MSDN

Tuttavia, c'è un trucco con questo: restituisce sempre la data in formato USA a meno che tu non imposti la cultura sul valore corretto.

Se non si imposta questa proprietà, il motore di associazione utilizza la proprietà Language dell'oggetto di destinazione del collegamento. In XAML il valore predefinito è "en-US" o eredita il valore dall'elemento radice (o da qualsiasi elemento) della pagina, se impostato in modo esplicito.

fonte

Un modo per farlo è nel codice sottostante (supponendo che tu abbia impostato la cultura del thread sul valore corretto):

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

L'altro modo è impostare la cultura del convertitore nell'associazione:

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

Anche se questo non ti consente di localizzare l'output.


Grazie! Avete capito bene! Quando ho chiesto, avevo in mente qual era il formato della stringa della data breve, dove avrei potuto trovare l'elenco dei formati delle stringhe, e mi è piaciuto anche che tu abbia risposto con StringFormat = d. Molto chiaro e completo.
Tony

produce sempre il formato USA indipendentemente dalle impostazioni della cultura?
CRice

@CRice - sì, lo fa - per qualche motivo - hai impostato tu stesso la cultura.
ChrisF

1
Grazie, piuttosto male quando l'interfaccia utente "d" risulta diversa da xaml.cs "d" dello stesso oggetto data.
CRice

ref il bug della cultura WPF, aggiungo solo this.Language = System.Windows.Markup.XmlLanguage.GetLanguage (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag); dopo l'inizializzazione di un componente in ogni finestra;
peterG

54

Oppure usalo per un formato inglese (o mescolalo per personalizzato):

StringFormat='{}{0:dd/MM/yyyy}'

2
Puoi anche usare "ConverterCulture =" nella tua associazione, che richiede un valore per indicare il formato. (ConverterCulture = 'en-GB' è la Gran Bretagna).
altrimenti il

questa è la risposta migliore e più semplice al problema
Steven

Saluti Steven! Ho anche battuto la risposta "vincente" al componente aggiuntivo ConverterCulture ... ma così sia.
altrimenti il

28

Usa la StringFormatproprietà (o ContentStringFormatsu ContentControle le sue derivate, ad esempio Label).

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

Notare che la notazione precedente all'argomento posizionale {}standard String.Formatconsente di eseguire l'escape delle parentesi graffe nel linguaggio di estensione del markup.


4
Le {}consentiranno di utilizzare StringFormat='{}Created Date:{0:d}'che altrimenti produrrebbe risultati inaspettati.
Mostro brunastro

13

Alcuni esempi di DateTime StringFormat che ho trovato utili. Estratto da esempi in 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

Se vuoi aggiungere una stringa con il valore usa questo:

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

5

Sii consapevole delle virgolette singole per il formato stringa. Questo non funziona:

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

mentre questo fa:

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

4

Usa solo:

<TextBlock Text="{Binding Date, StringFormat=\{0:d\}}" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.