Estoy intentando formatear un bloque de texto que está vinculado a una TimeSpanpropiedad. Funciona si la propiedad es de tipo DateTimepero 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
.Hoursy a.MinutesTotalMinuteslugar de unaMinutesparte de minutos (para mostrar los intervalos de tiempo más largos que 1 hora). Pero laTotalMinutespropiedad 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
TimeSpansiguiente 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
StringFormatdebe 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
StringFormatque funcionaráTimeSpandirectamente: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
Contentpropiedad (es decir, no laTextpropiedad como, por ejemplo, aTextBlock), seContentStringFormatdebe usar la propiedad . EspecificarStringFormatcomo parte del enlace no funcionará.TimeSpan StringFormat con milisegundos:
fuente