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?

Tony
quelle

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.

ChrisF
quelle
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}'
sonst
quelle
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.

user7116
quelle
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
Telos
quelle
4

Benutz einfach:

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

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

<TextBlock Text="{Binding Date, StringFormat= 'Date : {0:d}'}" />
Anurag
quelle
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}'}"
pawellipowczan
quelle