WPF Binding StringFormat Short Date String


86

Ich möchte das Format "Kurzes Datum mit dem Namen" in WPF verwenden.

Ich habe so etwas versucht wie:

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

Wie macht man das?

Antworten:


174

Versuche dies:

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

Dies ist kulturempfindlich und erfordert .NET 3.5 SP1 oder höher.

HINWEIS: Hierbei wird zwischen Groß- und Kleinschreibung unterschieden. "d" ist der kurze Datumsformatbezeichner, während "D" der lange Datumsformatbezeichner ist .

Auf der MSDN-Seite unter Standardzeichenfolgen für Datums- und Zeitformat finden Sie eine vollständige Liste des Zeichenfolgenformats sowie eine ausführlichere Erläuterung aller Optionen in diesem MSDN-Blogbeitrag

Es gibt jedoch ein Problem: Es gibt das Datum immer im US-Format aus, es sei denn, Sie stellen die Kultur selbst auf den richtigen Wert ein.

Wenn Sie diese Eigenschaft nicht festlegen, verwendet die Bindungs-Engine die Language- Eigenschaft des Bindungszielobjekts. In XAML ist dies standardmäßig "en-US" oder erbt den Wert vom Stammelement (oder einem beliebigen Element) der Seite, sofern eines explizit festgelegt wurde.

Quelle

Eine Möglichkeit, dies zu tun, ist der Code dahinter (vorausgesetzt, Sie haben die Kultur des Threads auf den richtigen Wert eingestellt):

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

Der andere Weg besteht darin, die Konverterkultur in die Bindung zu setzen:

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

Auf diese Weise können Sie die Ausgabe jedoch nicht lokalisieren.


Danke dir! Du hast es! Als ich fragte, dachte ich daran, was das String-Format für das kurze Datum ist, wo ich die Liste der String-Formate finden kann, und es hat mir auch gefallen, dass Sie mit StringFormat = d geantwortet haben. Sehr klar und vollständig.
Tony

Gibt dies unabhängig von den Kultureinstellungen immer das US-Format aus?
CRice

@CRice - ja, aus irgendeinem Grund haben Sie die Kultur selbst festgelegt.
ChrisF

1
Danke, ziemlich schlecht, wenn die Benutzeroberfläche "d" anders ausgibt als die xaml.cs "d" desselben Datumsobjekts.
CRice

Beziehen Sie den WPF-Kulturfehler, ich füge nur this.Language = System.Windows.Markup.XmlLanguage.GetLanguage (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag) hinzu; nach der Initialisierung der Komponente in jedem Fenster;
PeterG

51

Oder verwenden Sie dies für ein englisches Format (oder mischen Sie es für ein benutzerdefiniertes Format):

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

2
Sie können in Ihrer Bindung auch 'ConverterCulture =' verwenden. Für die Angabe des Formats ist ein Wert erforderlich. (ConverterCulture = 'en-GB' ist Großbritannien).
sonst

Dies ist die beste und einfachste Antwort für das Problem
Steven

Prost Steven! Ich habe auch die "gewinnende" Antwort auf das ConverterCulture-Add-On geschlagen ... aber so soll es sein.
sonst

27

Verwenden Sie die StringFormatEigenschaft (oder ContentStringFormaton ContentControlund seine Derivate, z Label. B. ).

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

Beachten Sie, dass {}vor der Standardnotation für String.FormatPositionsargumente die Klammern in der Sprache der Markup-Erweiterung maskiert werden können.


4
Das {}ermöglicht es Ihnen , zu verwenden , StringFormat='{}Created Date:{0:d}'die sonst zu unerwarteten Ergebnissen führen würde.
Brownish Monster

11

Einige DateTime StringFormat-Beispiele, die ich nützlich fand. Aus C # -Beispielen herausgehoben

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

4

Benutz einfach:

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

4

Wenn Sie eine Zeichenfolge mit dem Wert hinzufügen möchten, verwenden Sie Folgendes:

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

4

Beachten Sie die einfachen Anführungszeichen für das Zeichenfolgenformat. Das funktioniert nicht:

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

während dies tut:

    Content="{Binding PlannedDateTime, StringFormat='{}{0:yy.MM.dd HH:mm}'}"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.