Estou tentando formatar um bloco de texto vinculado a uma TimeSpan
propriedade. Funciona se a propriedade for do tipo, DateTime
mas falhará se for a TimeSpan
. Posso fazer isso usando um conversor. Mas estou tentando descobrir se há alternativas.
Código de amostra:
public TimeSpan MyTime { get; set; }
public Window2()
{
InitializeComponent();
MyTime = DateTime.Now.TimeOfDay;
DataContext = this;
}
Xaml
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Estou esperando que o bloco de texto mostre apenas horas e minutos. Mas está sendo mostrado como:
19: 10: 46,8048860
Respostas:
No .NET 3.5, você pode usar um MultiBinding em vez
Atualizar
Para responder aos comentários.
Para garantir a saída de 2 dígitos, mesmo que as horas ou minutos sejam de 0 a 9, você pode usar {0:00} em vez de {0}. Isso garantirá que a saída para o horário 12:01 seja 12:01 em vez de 12: 1.
Se você deseja produzir 01:01 como 01:01, use
StringFormat="{}{0}:{1:00}"
E a formatação condicional pode ser usada para remover o sinal negativo de minutos. Em vez de {1:00}, podemos usar {1: 00; 00}
fonte
.Hours
, bem como a.Minutes
TotalMinutes
vez deMinutes
como parte de minutos (para mostrar intervalos de tempo mais longos que 1 hora). Mas aTotalMinutes
propriedade está em formato duplo, então a vinculação usando o<Binding Path="MyTime.TotalMinutes" />
produz uma saída arredondada, o que é ruim - preciso mostrar o valor truncado em vez de arredondado. É possível fazer isso sem usar um conversor de valor personalizado para truncar double para int?A string de formato se destina a funcionar em um
DateTime
, não umTimeSpan
.Você pode alterar seu código para trabalhar
DateTime.Now
. Seu xaml está bom:Atualizar
E do formato .Net 4 a da
TimeSpan
seguinte forma:fonte
Apenas para adicionar ao pool, estou usando com sucesso esta ligação para exibir um TimeSpan em um aplicativo WPF de produção:
Fiz algumas tentativas para acertar as barras invertidas :)
fonte
StringFormat
deve estar na forma de uma string de formato. Neste caso, seria semelhante a:Observação: se você deseja exibir o número total de horas e minutos e o intervalo de tempo passa a ser maior que 24 horas, há uma ressalva com sua abordagem: Aqui está uma solução alternativa .
fonte
Para Multi bindings, você precisa prestar atenção desde .NET 4.
Uma breve visão geral abaixo, testada com .NET 4.6:
Encadernação regular:
Multi binding:
ou você pode usar "em vez de ' no multibinding:
Nota: usando StringFormat = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" será não trabalho em um MultiBinding, isso irá resultar em um resultado em branco.
fonte
Estou ciente de que esta questão é antiga agora, mas estou surpreso que ninguém sugeriu este simples
StringFormat
que funcionaráTimeSpan
diretamente em:fonte
O WPF no .NET 4 agora tem intervalo de tempo das strings http://msdn.microsoft.com/en-us/library/ee372286.aspx
Estou usando o seguinte
<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
fonte
Se quiser usar StringFormat em um rótulo que usa a propriedade Content, você pode usar ContentStringFormat para formatar seu intervalo de tempo:
fonte
Content
propriedade (ou seja, não aText
propriedade como, por exemplo, aTextBlock
), a propriedadeContentStringFormat
deve ser usada. EspecificarStringFormat
como parte da vinculação não funcionará.TimeSpan StringFormat com milissegundos:
fonte