Wiązanie WPF StringFormat krótki ciąg daty

89

Chciałbym użyć formatu ciągu o nazwie Short Date w WPF.

Próbowałem czegoś takiego:

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

Jak to zrobić?

Tony
źródło

Odpowiedzi:

177

Spróbuj tego:

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

który jest wrażliwy na kulturę i wymaga .NET 3.5 SP1 lub nowszego.

UWAGA: Rozróżniana jest wielkość liter. „d” to specyfikator formatu daty krótkiej, a „D” to specyfikator formatu daty długiej .

Pełna lista formatów ciągów znajduje się na stronie MSDN w standardowych ciągach formatu daty i godziny oraz pełniejsze wyjaśnienie wszystkich opcji w tym wpisie na blogu MSDN

Jest jednak jeden problem - zawsze wyświetla datę w formacie amerykańskim, chyba że sam ustawisz kulturę na poprawną wartość.

Jeśli ta właściwość nie zostanie ustawiona, aparat powiązań użyje właściwości Language obiektu docelowego powiązania. W języku XAML jest to domyślnie „en-US” lub dziedziczy wartość z elementu głównego (lub dowolnego elementu) strony, jeśli został jawnie ustawiony.

Źródło

Można to zrobić w kodzie (zakładając, że ustawiłeś kulturę wątku na poprawną wartość):

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

Innym sposobem jest ustawienie kultury konwertera w powiązaniu:

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

Chociaż nie pozwala to na zlokalizowanie wyjścia.

ChrisF
źródło
Dziękuję Ci! Masz to! Kiedy zapytałem, miałem na myśli, jaki jest format ciągu z datą krótką, gdzie mogę znaleźć listę formatów ciągów, a także podobało mi się, że odpowiedziałeś StringFormat = d. Bardzo jasne i kompletne.
Tony
czy to zawsze wyświetla format US, niezależnie od ustawień kultury?
CRice
@CRice - tak - z jakiegoś powodu - sam ustaliłeś kulturę.
ChrisF
1
Dzięki, bardzo źle, gdy "d" interfejsu użytkownika wyświetla inaczej niż "d" xaml.cs tego samego obiektu daty.
CRice
ref błąd kultury WPF, po prostu dodaję this.Language = System.Windows.Markup.XmlLanguage.GetLanguage (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag); po zainicjowaniu komponentu w każdym oknie;
peterG
54

Lub użyj tego dla formatu angielskiego (lub wymieszaj go dla niestandardowego):

StringFormat='{}{0:dd/MM/yyyy}'
jeszcze
źródło
2
Możesz również użyć „ConverterCulture =” w swoim powiązaniu - co wymaga wartości do wskazania formatu. (ConverterCulture = 'en-GB' to Wielka Brytania).
innym przypadku
ta jest najlepszą i najłatwiejszą odpowiedzią na problem
Steven
Pozdrawiam Steven! Również pokonałem „zwycięską” odpowiedź dla dodatku ConverterCulture ... ale niech tak będzie.
jeszcze
28

Użyj StringFormatwłaściwości (lub ContentStringFormatna ContentControli jej pochodnych, np Label.).

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

Zwróć uwagę, że notacja {}poprzedzająca standardową String.Formatnotację argumentów pozycyjnych pozwala na ucieczkę nawiasów klamrowych w języku rozszerzenia znaczników.

user7116
źródło
4
{}Będzie można używać StringFormat='{}Created Date:{0:d}'które w przeciwnym razie byłyby nieoczekiwane rezultaty.
Brownish Monster
13

Niektóre przykłady DateTime StringFormat, które uznałem za przydatne. Zaczerpnięte z przykładów 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
źródło
5

Jeśli chcesz dodać ciąg z wartością, użyj tego:

<TextBlock Text="{Binding Date, StringFormat= 'Date : {0:d}'}" />
Anurag
źródło
5

Zwróć uwagę na pojedyncze cudzysłowy dla formatu ciągu. To nie działa:

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

podczas gdy to robi:

    Content="{Binding PlannedDateTime, StringFormat='{}{0:yy.MM.dd HH:mm}'}"
pawellipowczan
źródło
4

Po prostu użyj:

<TextBlock Text="{Binding Date, StringFormat=\{0:d\}}" />
as-cii
źródło