Próbuję sformatować blok tekstowy, który jest powiązany z TimeSpan
właściwością. Działa, jeśli właściwość jest typu, DateTime
ale kończy się niepowodzeniem, jeśli jest to TimeSpan
. Mogę to zrobić za pomocą konwertera. Ale próbuję się dowiedzieć, czy są jakieś alternatywy.
Przykładowy kod:
public TimeSpan MyTime { get; set; }
public Window2()
{
InitializeComponent();
MyTime = DateTime.Now.TimeOfDay;
DataContext = this;
}
Xaml
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Oczekuję, że blok tekstowy pokaże tylko godziny i mięty. Ale pokazuje się jako:
19:10: 46,8048860
Odpowiedzi:
W .NET 3.5 można zamiast tego użyć MultiBinding
<TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}{0}:{1}"> <Binding Path="MyTime.Hours"/> <Binding Path="MyTime.Minutes"/> </MultiBinding> </TextBlock.Text> </TextBlock>
Aktualizacja
Aby odpowiedzieć na komentarze.
Aby mieć pewność, że wypisujesz 2 cyfry, nawet jeśli godziny lub minuty to 0–9, możesz użyć {0:00} zamiast {0}. Zapewni to, że wyjście dla czasu 12:01 to 12:01 zamiast 12: 1.
Jeśli chcesz wypisać 01:01 jako 1:01 użyj
StringFormat="{}{0}:{1:00}"
I formatowanie warunkowe może być stosowany do usuwania znak ujemny dla minut. Zamiast {1:00} możemy użyć {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>
źródło
.Hours
a także do.Minutes
TotalMinutes
zamiastMinutes
jako część minut (aby pokazać okresy najdłuższe niż 1 godzina). AleTotalMinutes
właściwość jest w formacie podwójnym, więc wiązanie przy użyciu<Binding Path="MyTime.TotalMinutes" />
zaokrąglonych danych wyjściowych jest złe - muszę pokazać obciętą wartość zamiast zaokrąglenia. Czy można to osiągnąć bez używania konwertera wartości niestandardowej do obcinania double do int?Ciąg formatu ma działać na a
DateTime
, a nieTimeSpan
.Zamiast tego możesz zmienić swój kod, aby działał
DateTime.Now
. Twój XAML jest w porządku:<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Aktualizacja
A z formatu .Net 4 a
TimeSpan
w następujący sposób:<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>
źródło
Aby dodać do puli, pomyślnie używam tego powiązania do wyświetlania TimeSpan w produkcyjnej aplikacji WPF:
Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"
Podjęto kilka prób, aby uzyskać prawidłowe ukośniki :)
źródło
StringFormat
musi mieć postać ciągu formatu. W tym przypadku wyglądałoby to tak:<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>
Uwaga: jeśli chcesz wyświetlić całkowitą liczbę godzin i minut, a przedział czasu jest dłuższy niż 24 godziny, istnieje zastrzeżenie dotyczące Twojego podejścia: Oto obejście .
źródło
W przypadku powiązań Multi należy zwrócić uwagę, ponieważ .NET 4.
Krótki przegląd poniżej, przetestowany z .NET 4.6:
Zwykłe wiązanie:
<TextBlock Text="{Binding Start, StringFormat='{}{0:hh\\:mm\\:ss}'}" />
Wiązanie multi:
<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>
lub możesz użyć „ zamiast ” w multibindingu:
<MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'>
Uwaga: użycie StringFormat = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" spowoduje nie praca na MultiBinding, spowoduje to w efekcie pusty.
źródło
Zdaję sobie sprawę, że to pytanie jest stare, ale jestem zaskoczony, że nikt nie zaproponował tego prostego,
StringFormat
które zadziałaTimeSpan
bezpośrednio na:<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
źródło
WPF w .NET 4 ma teraz przedział czasu z ciągów http://msdn.microsoft.com/en-us/library/ee372286.aspx
Używam następujących
<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
źródło
Jeśli chcesz użyć StringFormat w Label, która używa właściwości Content, możesz użyć ContentStringFormat, aby sformatować swój przedział czasu:
<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"
źródło
Content
właściwości (tj. NieText
właściwości, jak na przykład aTextBlock
), właściwośćContentStringFormat
musi być używana. OkreślanieStringFormat
jako część powiązania nie zadziała.TimeSpan StringFormat z milisekundami:
<TextBlock Text="{Binding MyTime, StringFormat=\{0:hh\\:mm\\:ss\\.fff\}}"/>
źródło