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?

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.


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}'

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.


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

5

Jika Anda ingin menambahkan string dengan nilai gunakan ini:

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

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}'}"

4

Gunakan saja:

<TextBlock Text="{Binding Date, StringFormat=\{0:d\}}" />
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.