WPF Binding StringFormat String Tanggal Pendek

89

Saya ingin menggunakan format string bernama Tanggal Pendek di WPF.

Saya mencoba sesuatu seperti:

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

Bagaimana cara melakukannya?

Tony
sumber

Jawaban:

177

Coba ini:

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

yang peka budaya dan membutuhkan .NET 3.5 SP1 atau lebih tinggi.

CATATAN: Ini peka huruf besar / kecil. "d" adalah penentu format tanggal pendek sedangkan "D" adalah penentu format tanggal panjang .

Ada daftar lengkap format string di halaman MSDN di Standard Date and Time Format Strings dan penjelasan lebih lengkap tentang semua opsi di posting blog MSDN ini

Namun, ada satu gotcha dengan ini - selalu menampilkan tanggal dalam format AS kecuali Anda mengatur sendiri budaya ke nilai yang benar.

Jika Anda tidak menyetel properti ini, mesin pengikat menggunakan properti Bahasa dari objek target pengikatan. Di XAML, defaultnya adalah "en-US" atau mewarisi nilai dari elemen root (atau elemen apa pun) halaman, jika telah ditetapkan secara eksplisit.

Sumber

Salah satu cara untuk melakukan ini adalah di kode di belakang (dengan asumsi Anda telah mengatur budaya utas ke nilai yang benar):

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

Cara lain adalah dengan mengatur budaya konverter dalam pengikatan:

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

Meskipun ini tidak memungkinkan Anda untuk melokalkan keluaran.

ChrisF
sumber
Terima kasih! Benar! Ketika saya bertanya, saya ingat apa itu format string Tanggal Pendek, di mana saya bisa menemukan daftar format string, dan juga saya suka Anda menjawab dengan StringFormat = d. Sangat jelas dan lengkap.
Tony
apakah ini selalu menghasilkan format AS terlepas dari pengaturan budaya?
CRice
@ CRice - ya benar - untuk beberapa alasan - Anda telah menetapkan budayanya sendiri.
ChrisF
1
Terima kasih, sangat buruk ketika UI "d" menghasilkan berbeda dengan xaml.cs "d" dari objek tanggal yang sama.
CRice
ref bug budaya WPF, saya hanya menambahkan this.Language = System.Windows.Markup.XmlLanguage.GetLanguage (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag); setelah komponen awal di setiap jendela;
peterG
54

Atau gunakan ini untuk format bahasa Inggris (atau gabungkan untuk custom):

StringFormat='{}{0:dd/MM/yyyy}'
lain
sumber
2
Anda juga dapat menggunakan 'ConverterCulture =' dalam penjilidan Anda - yang membutuhkan nilai untuk menunjukkan formatnya. (ConverterCulture = 'en-GB' adalah Inggris Raya).
lainnya
ini adalah jawaban terbaik dan termudah untuk masalah ini
Steven
Cheers Steven! Saya juga mengalahkan jawaban "menang" untuk add-on ConverterCulture juga ... tapi biarlah.
lagi
28

Gunakan StringFormatproperti (atau ContentStringFormatpada ContentControldan turunannya, misalnya Label).

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

Perhatikan bahwa {}sebelum standar String.Formatargumen posisi, notasi memungkinkan tanda kurung di-escape dalam bahasa ekstensi markup.

pengguna7116
sumber
4
Ini {}akan memungkinkan Anda untuk menggunakan StringFormat='{}Created Date:{0:d}'yang sebaliknya akan menghasilkan hasil yang tidak terduga.
Brownish Monster
13

Beberapa contoh StringFormat DateTime menurut saya berguna. Diangkat dari Contoh 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
sumber
5

Jika Anda ingin menambahkan string dengan nilai gunakan ini:

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

Perhatikan tanda kutip tunggal untuk format string. Ini tidak berhasil:

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

sementara ini:

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

Gunakan saja:

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