Estoy intentando formatear un bloque de texto que está vinculado a una TimeSpan
propiedad. Funciona si la propiedad es de tipo DateTime
pero falla si es un TimeSpan
. Puedo hacerlo usando un convertidor. Pero estoy tratando de averiguar si hay alternativas.
Código de muestra:
public TimeSpan MyTime { get; set; }
public Window2()
{
InitializeComponent();
MyTime = DateTime.Now.TimeOfDay;
DataContext = this;
}
Xaml
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Espero que el bloque de texto muestre solo horas y minutos. Pero se muestra como:
19: 10: 46.8048860
Respuestas:
En .NET 3.5, podría usar un MultiBinding en su lugar
Actualizar
Para responder a los comentarios.
Para asegurarse de generar 2 dígitos, incluso si las horas o los minutos son 0-9, puede usar {0:00} en lugar de {0}. Esto asegurará que la salida para la hora 12:01 sea 12:01 en lugar de 12: 1.
Si desea generar 01:01 como 1:01 use
StringFormat="{}{0}:{1:00}"
Y el formato condicional se puede utilizar para eliminar el signo negativo durante minutos. En lugar de {1:00} podemos usar {1: 00; 00}
fuente
.Hours
y a.Minutes
TotalMinutes
lugar de unaMinutes
parte de minutos (para mostrar los intervalos de tiempo más largos que 1 hora). Pero laTotalMinutes
propiedad está en formato doble, por lo que la vinculación con el<Binding Path="MyTime.TotalMinutes" />
produce una salida redondeada, lo cual es malo: necesito mostrar un valor truncado en lugar de redondeado. ¿Es posible lograrlo sin usar un convertidor de valor personalizado para truncar de doble a int?La cadena de formato está diseñada para funcionar en a
DateTime
, no enTimeSpan
.En su lugar, podría cambiar su código para trabajar
DateTime.Now
. Tu xaml está bien:Actualizar
Y desde el formato .Net 4 a de la
TimeSpan
siguiente manera:fuente
Solo para agregar al grupo, estoy usando con éxito este enlace para mostrar un TimeSpan en una aplicación WPF de producción:
Tomó algunos intentos para obtener las barras invertidas correctas :)
fuente
StringFormat
debe tener la forma de una cadena de formato. En este caso, se vería así:Nota: si desea mostrar el número total de horas y minutos y el intervalo de tiempo es superior a 24 horas, hay una advertencia con su enfoque: aquí hay una solución .
fuente
Para los enlaces múltiples, debe prestar atención ya que .NET 4.
Una breve descripción a continuación, probada con .NET 4.6:
Encuadernación regular:
Enlace múltiple:
o puede usar "en lugar de " en el enlace múltiple:
Nota: el uso de StringFormat = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" va a no trabajar en un MultiBinding, esto dará lugar a un resultado en blanco.
fuente
Soy consciente de que esta pregunta es antigua ahora, pero me sorprende que nadie sugiera esto simple
StringFormat
que funcionaráTimeSpan
directamente:fuente
WPF en .NET 4 ahora tiene un intervalo de tiempo de cadenas http://msdn.microsoft.com/en-us/library/ee372286.aspx
Estoy usando lo siguiente
<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
fuente
Si desea usar StringFormat en una etiqueta que usa la propiedad Content, puede usar ContentStringFormat para formatear su intervalo de tiempo:
fuente
Content
propiedad (es decir, no laText
propiedad como, por ejemplo, aTextBlock
), seContentStringFormat
debe usar la propiedad . EspecificarStringFormat
como parte del enlace no funcionará.TimeSpan StringFormat con milisegundos:
fuente