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?

Tony
la source

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.

ChrisF
la source
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}'
autre
la source
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.

user7116
la source
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
Telos
la source
5

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

<TextBlock Text="{Binding Date, StringFormat= 'Date : {0:d}'}" />
Anurag
la source
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}'}"
pawellipowczan
la source
4

Utilisez simplement:

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