Chaîne de liaison WPFFormat Short Date String


89

Je voudrais utiliser le format de chaîne nommé Short Date dans WPF.

J'ai essayé quelque chose comme:

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

Comment faire cela?

Réponses:


177

Essaye ça:

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

qui est sensible à la culture et nécessite .NET 3.5 SP1 ou supérieur.

REMARQUE: cela est sensible à la casse. "d" est le spécificateur de format de date courte tandis que "D" est le spécificateur de format de date longue .

Il existe une liste complète des formats de chaîne sur la page MSDN sur les chaînes de format de date et d'heure standard et une explication plus complète de toutes les options de ce billet de blog MSDN

Cependant, il y a un problème avec cela: il affiche toujours la date au format américain, sauf si vous définissez vous-même la culture sur la valeur correcte.

Si vous ne définissez pas cette propriété, le moteur de liaison utilise la propriété Language de l'objet cible de liaison. En XAML, la valeur par défaut est "en-US" ou hérite de la valeur de l'élément racine (ou de tout élément) de la page, si l'un a été défini explicitement.

La source

Une façon de le faire est dans le code derrière (en supposant que vous avez défini la culture du thread sur la valeur correcte):

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

L'autre méthode consiste à définir la culture du convertisseur dans la liaison:

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

Bien que cela ne vous permette pas de localiser la sortie.


Merci! Tu l'as eu! Quand j'ai demandé, j'avais en tête quel était le format de chaîne Short Date, où pourrais-je trouver la liste des formats de chaîne, et j'ai également aimé que vous ayez répondu avec StringFormat = d. Très clair et complet.
Tony

cela génère-t-il toujours le format américain quels que soient les paramètres de culture?
CRice

@CRice - oui c'est le cas - pour une raison quelconque - vous avez défini la culture vous-même.
ChrisF

1
Merci, plutôt mauvais lorsque l'interface utilisateur "d" affiche une sortie différente du xaml.cs "d" du même objet date.
CRice

ref le bogue de culture WPF, je viens d'ajouter this.Language = System.Windows.Markup.XmlLanguage.GetLanguage (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag); après initialisation du composant dans chaque fenêtre;
peterG

54

Ou utilisez ceci pour un format anglais (ou mélangez-le pour un format personnalisé):

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

2
Vous pouvez également utiliser 'ConverterCulture =' dans votre liaison - qui nécessite une valeur pour indiquer le format. (ConverterCulture = 'en-GB' est la Grande-Bretagne).
sinon

celle-ci est la meilleure et la plus simple réponse au problème
Steven

Salut Steven! J'ai aussi battu la réponse «gagnante» à l'add-on ConverterCulture aussi ... mais qu'il en soit ainsi.
sinon

28

Utilisez la StringFormatpropriété (ou ContentStringFormatsur ContentControlet ses dérivés, par exemple Label).

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

Notez que la notation {}antérieure à l' String.Formatargument positionnel standard permet aux accolades d'être échappées dans le langage d'extension de balisage.


4
Le {}vous permettra d'utiliser StringFormat='{}Created Date:{0:d}'ce qui autrement produirait des résultats inattendus.
Monstre brunâtre

13

Quelques exemples de DateTime StringFormat que j'ai trouvés utiles. Tiré des exemples 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

Si vous voulez ajouter une chaîne avec la valeur, utilisez ceci:

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

5

Tenez compte des guillemets simples pour le format de chaîne. Cela ne fonctionne pas:

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

alors que cela fait:

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

4

Utilisez simplement:

<TextBlock Text="{Binding Date, StringFormat=\{0:d\}}" />
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.