c# - decimals - Cómo formatear TimeSpan en XAML
wpf string format binding (8)
Estoy tratando de formatear un bloque de texto que está vinculado a una propiedad TimeSpan
. Funciona si la propiedad es de tipo DateTime
pero falla si se trata de un TimeSpan
. Puedo hacerlo usando un convertidor. Pero estoy tratando de averiguar si hay alguna alternativa.
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}"/>
Estoy esperando que el bloque de texto muestre solo horas y minutos. Pero se muestra como:
19: 10: 46.8048860
En .NET 3.5 podría usar un MultiBinding en su lugar
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}:{1}">
<Binding Path="MyTime.Hours"/>
<Binding Path="MyTime.Minutes"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Actualizar
Para responder los comentarios.
Para asegurarse de que muestre 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 el tiempo 12:01 sea 12:01 en lugar de 12: 1.
Si quieres generar 01:01 como 1:01 usa StringFormat="{}{0}:{1:00}"
Y el formato condicional se puede usar para eliminar el signo negativo por minutos. En lugar de {1:00} podemos usar {1: 00; 00}
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:00}:{1:00;00}">
<Binding Path="MyTime.Hours" />
<Binding Path="MyTime.Minutes" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
La cadena de formato está diseñada para funcionar en un DateTime
, no en un TimeSpan
.
Puede cambiar su código para trabajar con DateTime.Now
lugar. Tu xaml está bien:
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Actualizar
Y a partir de .NET 4 formatee un TimeSpan
siguiente manera:
<TextBlock Text="{Binding MyTime,StringFormat=hh//:mm}"/>
Para enlaces múltiples, necesita prestar atención desde .NET 4.
Una breve descripción a continuación, probada con .NET 4.6:
Encuadernación regular:
<TextBlock Text="{Binding Start, StringFormat=''{}{0:hh//:mm//:ss}''}" />
Enlace múltiple:
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:hh'':''mm'':''ss} -> {1:hh'':''mm'':''ss}">
<Binding Path="Start" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="End" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>
</TextBlock.Text>
o puede usar "en lugar de " en la multiburación:
<MultiBinding StringFormat=''{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}''>
Nota: el uso de StringFormat = "{} {0: hh /: /: mm /: ss} -> {1: hh /: mm /: ss}" no funcionará en un enlace múltiple, esto dará como resultado un resultado en blanco.
Si desea utilizar StringFormat en una etiqueta que usa la propiedad de contenido, puede usar ContentStringFormat para formatear su período de tiempo:
<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"
Solo para agregar al grupo, estoy usando con éxito este enlace para mostrar un TimeSpan en una aplicación WPF de producción:
Binding="{Binding Time, Mode=TwoWay, StringFormat=/{0:h//:mm/}}"
Hizo algunos intentos para obtener las barras diagonales a la derecha :)
Soy consciente de que esta pregunta es antigua ahora, pero me sorprende que nadie sugiriera este simple StringFormat
que funcionará en un TimeSpan
directamente:
<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
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}}" />
StringFormat
debe tener la forma de una cadena de formato. En este caso, se vería así:
<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh//:mm}`}"/>
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 .