WPF Binding StringFormat สตริงวันที่สั้น


89

ฉันต้องการใช้รูปแบบสตริงชื่อวันที่สั้นใน WPF

ฉันลองทำสิ่งที่ชอบ:

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

ต้องทำอย่างไร?

คำตอบ:


179

ลองสิ่งนี้:

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

ซึ่งมีความอ่อนไหวทางวัฒนธรรมและต้องใช้. NET 3.5 SP1 ขึ้นไป

หมายเหตุ: นี่เป็นกรณีที่ละเอียดอ่อน "D" เป็นรูปแบบระบุวันที่สั้นในขณะที่ "D" เป็นรูปแบบระบุวันที่ที่ยาวนาน

มีรายการรูปแบบสตริงทั้งหมดในหน้า MSDN ใน Standard Date and Time Format Stringsและคำอธิบายที่สมบูรณ์ของตัวเลือกทั้งหมดในโพสต์บล็อก MSDN นี้

อย่างไรก็ตามมี gotcha อยู่หนึ่งรายการโดยจะแสดงวันที่ในรูปแบบ US เสมอเว้นแต่คุณจะตั้งค่าวัฒนธรรมให้ถูกต้องด้วยตัวคุณเอง

หากคุณไม่ได้ตั้งค่าคุณสมบัตินี้เอ็นจินการโยงจะใช้คุณสมบัติภาษาของอ็อบเจ็กต์เป้าหมายการโยง ใน XAML ค่าเริ่มต้นนี้จะเป็น "en-US" หรือสืบทอดค่าจากรูทอิลิเมนต์ (หรือองค์ประกอบใด ๆ ) ของเพจหากมีการตั้งค่าไว้อย่างชัดเจน

ที่มา

วิธีหนึ่งในการทำเช่นนี้คือในโค้ดด้านหลัง (สมมติว่าคุณได้ตั้งค่าวัฒนธรรมของเธรดเป็นค่าที่ถูกต้อง):

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

อีกวิธีหนึ่งคือการตั้งค่าวัฒนธรรมตัวแปลงในการผูก:

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

แม้ว่าจะไม่อนุญาตให้คุณแปลเอาต์พุต


ขอขอบคุณ! คุณเข้าใจแล้ว! เมื่อฉันถามฉันว่ารูปแบบสตริง Short Date คืออะไรฉันจะหารายการรูปแบบสตริงได้ที่ไหนและฉันชอบที่คุณตอบด้วย StringFormat = d ชัดเจนและสมบูรณ์มาก
Tony

สิ่งนี้ส่งออกรูปแบบ US เสมอโดยไม่คำนึงถึงการตั้งค่าวัฒนธรรม
CRice

@CRice - ใช่ - ด้วยเหตุผลบางประการคุณได้กำหนดวัฒนธรรมด้วยตัวคุณเอง
ChrisF

1
ขอบคุณค่อนข้างแย่เมื่อ UI "d" แสดงผลต่างกับ xaml.cs "d" ของออบเจ็กต์วันที่เดียวกัน
CRice

อ้างอิงข้อผิดพลาดวัฒนธรรม WPF ฉันแค่เพิ่มสิ่งนี้ภาษา = System.Windows.Markup.XmlLanguage.GetLanguage (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag); หลังจาก initializecomponent ในทุกหน้าต่าง
peterG

54

หรือใช้สิ่งนี้สำหรับรูปแบบภาษาอังกฤษ (หรือผสมเพื่อกำหนดเอง):

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

2
คุณยังสามารถใช้ 'ConverterCulture =' ในการผูกของคุณซึ่งต้องใช้ค่าเพื่อระบุรูปแบบ (ConverterCulture = 'en-GB' คือบริเตนใหญ่)
อื่น ๆ

ข้อนี้เป็นคำตอบที่ดีที่สุดและง่ายที่สุดสำหรับปัญหา
สตีเวน

ไชโยสตีเวน! ฉันยังเอาชนะคำตอบที่ "ชนะ" ของโปรแกรมเสริม ConverterCulture ด้วย ... แต่ไม่ว่าจะเป็น
else

28

ใช้StringFormatคุณสมบัติ (หรือContentStringFormatบนContentControlและอนุพันธ์ของมันเช่นLabel)

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

หมายเหตุ{}ก่อนหน้ารูปแบบString.Formatอาร์กิวเมนต์ตำแหน่งมาตรฐานอนุญาตให้ใช้เครื่องหมายวงเล็บในภาษาส่วนขยายมาร์กอัป


4
{}จะช่วยให้คุณใช้StringFormat='{}Created Date:{0:d}'ซึ่งจะก่อให้เกิดผลที่ไม่คาดคิด
Brownish Monster

13

ตัวอย่าง DateTime StringFormat ที่ฉันพบว่ามีประโยชน์ ยกมาจากตัวอย่าง 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

หากคุณต้องการเพิ่มสตริงที่มีค่าให้ใช้สิ่งนี้:

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

5

ระวังเครื่องหมายคำพูดเดี่ยวสำหรับรูปแบบสตริง สิ่งนี้ใช้ไม่ได้:

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

ในขณะที่สิ่งนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.