WPF Binding StringFormat Cadena de fecha corta

89

Me gustaría usar el formato de cadena con nombre Short Date en WPF.

Intenté algo como:

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

¿Como hacer esto?

Tony
fuente

Respuestas:

177

Prueba esto:

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

que es sensible a la cultura y requiere .NET 3.5 SP1 o superior.

NOTA: Esto distingue entre mayúsculas y minúsculas. "d" es el especificador de formato de fecha corta, mientras que "D" es el especificador de formato de fecha larga .

Hay una lista completa de formato de cadena en la página de MSDN sobre cadenas de formato de fecha y hora estándar y una explicación más completa de todas las opciones en esta publicación de blog de MSDN

Sin embargo, hay un problema con esto: siempre genera la fecha en formato de EE. UU. A menos que usted mismo establezca la cultura en el valor correcto.

Si no establece esta propiedad, el motor de enlace usa la propiedad Language del objeto de destino de enlace. En XAML, este valor predeterminado es "en-US" o hereda el valor del elemento raíz (o cualquier elemento) de la página, si se ha establecido uno explícitamente.

Fuente

Una forma de hacer esto es en el código subyacente (suponiendo que haya configurado la cultura del hilo en el valor correcto):

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

La otra forma es establecer la cultura del convertidor en el enlace:

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

Aunque esto no le permite localizar la salida.

ChrisF
fuente
¡Gracias! ¡Lo tienes! Cuando le pregunté, tenía en mente cuál era el formato de cadena de fecha corta, dónde podría encontrar la lista de formatos de cadena y también me gustó que respondiera con StringFormat = d. Muy claro y completo.
Tony
¿Esto siempre genera formato de EE. UU. independientemente de la configuración cultural?
CRice
@CRice, sí, por alguna razón, tú mismo has establecido la cultura.
ChrisF
1
Gracias, bastante mal cuando la interfaz de usuario "d" genera un resultado diferente al xaml.cs "d" del mismo objeto de fecha.
CRice
ref el error de cultura de WPF, solo agrego this.Language = System.Windows.Markup.XmlLanguage.GetLanguage (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag); después de initializecomponent en cada ventana;
peterG
54

O use esto para un formato en inglés (o mezcle para personalizar):

StringFormat='{}{0:dd/MM/yyyy}'
más
fuente
2
También puede usar 'ConverterCulture =' en su enlace, que requiere un valor para indicar el formato. (ConverterCulture = 'en-GB' es Gran Bretaña).
si no,
esta es la mejor y más fácil respuesta para el problema
Steven
¡Salud Steven! También superé la respuesta "ganadora" al complemento ConverterCulture también ... pero que así sea.
más
28

Utilice la StringFormatpropiedad (o ContentStringFormatsobre ContentControly sus derivados, por ejemplo Label).

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

Tenga en cuenta que {}antes de la String.Formatnotación de argumentos posicionales estándar permite que las llaves se escapen en el lenguaje de extensión de marcado.

usuario7116
fuente
4
El {}le permitirá usar lo StringFormat='{}Created Date:{0:d}'que de otra manera produciría resultados inesperados.
Monstruo marrón
13

Algunas muestras de DateTime StringFormat que encontré útiles. Extraído de ejemplos de 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
fuente
5

Si desea agregar una cadena con el valor, use esto:

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

Tenga en cuenta las comillas simples para el formato de cadena. Esto no funciona:

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

mientras esto hace:

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

Solo usa:

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