Ich versuche, einen Textblock zu formatieren, der an eine TimeSpan
-Eigenschaft gebunden ist. Es funktioniert, wenn die Eigenschaft vom Typ DateTime
ist, aber es schlägt fehl, wenn es sich um eine TimeSpan
handelt. Ich kann es mit einem Konverter erledigen. Aber ich versuche herauszufinden, ob es Alternativen gibt.
Beispielcode:
public TimeSpan MyTime { get; set; }
public Window2()
{
InitializeComponent();
MyTime = DateTime.Now.TimeOfDay;
DataContext = this;
}
Xaml
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Ich erwarte, dass der Textblock nur Stunden und Minuten anzeigt. Aber es zeigt sich als:
19: 10: 46.8048860
In .NET 3.5 können Sie stattdessen ein MultiBinding verwenden
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}:{1}">
<Binding Path="MyTime.Hours"/>
<Binding Path="MyTime.Minutes"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Update
Um die Kommentare zu beantworten.
Um sicherzustellen, dass Sie 2 Ziffern ausgeben, auch wenn Stunden oder Minuten 0-9 sind, können Sie {0:00} anstelle von {0} verwenden. Dies stellt sicher, dass die Ausgabe für die Zeit 12:01 12:01 statt 12: 1 ist.
Wenn Sie 01:01 als 1:01 ausgeben möchten, verwenden Sie StringFormat="{}{0}:{1:00}"
Und Bedingte Formatierung kann verwendet werden, um das negative Vorzeichen für Minuten zu entfernen. Anstelle von {1:00} können wir auch {1: 00; 00} verwenden.
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:00}:{1:00;00}">
<Binding Path="MyTime.Hours" />
<Binding Path="MyTime.Minutes" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Die Formatzeichenfolge soll auf einem DateTime
und nicht auf einem TimeSpan
funktionieren.
Sie können Ihren Code ändern, um stattdessen mit DateTime.Now
Zu arbeiten. Dein XAML ist in Ordnung:
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Update
Und von . Net 4 formatiere ein TimeSpan
wie folgt:
<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>
Nur um den Pool zu erweitern, verwende ich diese Bindung erfolgreich, um eine TimeSpan in einer WPF-Produktionsanwendung anzuzeigen:
Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"
Habe ein paar Versuche unternommen, um die Backslashes richtig hinzubekommen :)
StringFormat
muss in Form einer Formatzeichenfolge vorliegen. In diesem Fall würde es so aussehen:
<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>
Hinweis: Wenn Sie die Gesamtzahl der Stunden und Minuten anzeigen möchten und die Zeitspanne länger als 24 Stunden ist, gibt es eine Einschränkung bei Ihrer Vorgehensweise: Hier ist eine Problemumgehung .
Bei Multi-Bindungen müssen Sie seit .NET 4 aufpassen.
Eine kurze Übersicht unten, getestet mit .NET 4.6:
Regelmäßige Bindung:
<TextBlock Text="{Binding Start, StringFormat='{}{0:hh\\:mm\\:ss}'}" />
Mehrfachbindung:
<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>
oder Sie könnten " anstelle von ' in der Mehrfachbindung verwenden:
<MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'>
Hinweis: Verwenden Sie StringFormat = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" wird nicht an einem MultiBinding arbeiten, dies wird zu einem leeren Ergebnis führen.
WPF in .NET 4 hat jetzt eine Zeitspanne von Zeichenfolgen http://msdn.Microsoft.com/en-us/library/ee372286.aspx
Ich benutze das folgende <TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
Ich bin mir bewusst, dass diese Frage jetzt alt ist, aber ich bin überrascht, dass niemand diese einfache StringFormat
vorgeschlagen hat, die direkt auf eine TimeSpan
angewendet werden kann:
<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
Wenn Sie StringFormat in einem Label verwenden möchten, das die Content-Eigenschaft verwendet, können Sie ContentStringFormat verwenden, um Ihre Zeitspanne zu formatieren:
<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"