Ich versuche, einen Textblock zu formatieren, der an eine TimeSpan
Eigenschaft gebunden ist . Es funktioniert, wenn die Eigenschaft vom Typ ist, DateTime
aber es schlägt fehl, wenn es eine ist TimeSpan
. 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
Antworten:
In .NET 3.5 können Sie stattdessen ein MultiBinding verwenden
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. Dadurch wird sichergestellt, 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}"
Die bedingte Formatierung kann verwendet werden, um das negative Vorzeichen für Minuten zu entfernen. Anstelle von {1:00} können wir {1: 00; 00} verwenden
quelle
.Hours
als auch an.Minutes
TotalMinutes
anstelle vonMinutes
Minuten anzeigen (um Zeiträume anzuzeigen, die am längsten diese 1 Stunde sind). Da dieTotalMinutes
Eigenschaft jedoch im doppelten Format vorliegt, führt das Binden mit der<Binding Path="MyTime.TotalMinutes" />
Ausgabe zu einer gerundeten Ausgabe, was schlecht ist. Ich muss einen abgeschnittenen Wert anstelle eines gerundeten Werts anzeigen. Es ist möglich, dies zu erreichen, ohne einen benutzerdefinierten Wertekonverter zum Abschneiden von double auf int zu verwenden.Die Formatzeichenfolge soll auf a
DateTime
und nicht auf a funktionierenTimeSpan
.Sie können
DateTime.Now
stattdessen Ihren Code ändern, um damit zu arbeiten . Dein xaml ist in Ordnung:Aktualisieren
Und aus dem .Net 4- Format a
TimeSpan
wie folgt:quelle
Um den Pool zu erweitern, verwende ich diese Bindung erfolgreich, um einen TimeSpan in einer Produktions-WPF-App anzuzeigen:
Hat einige Versuche unternommen, um die Backslashes richtig zu machen :)
quelle
StringFormat
muss in Form einer Formatzeichenfolge vorliegen. In diesem Fall würde es so aussehen:Hinweis: Wenn Sie die Gesamtzahl der Stunden und Minuten anzeigen möchten und die Zeitspanne mehr als 24 Stunden beträgt, gibt es eine Einschränkung bei Ihrem Ansatz: Hier ist eine Problemumgehung .
quelle
Bei Mehrfachbindungen müssen Sie seit .NET 4 aufpassen.
Eine kurze Übersicht unten, getestet mit .NET 4.6:
Regelmäßige Bindung:
Mehrfachbindung:
oder Sie könnten " anstelle von " in der Multibindung verwenden:
Hinweis: Die Verwendung String = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" wird nicht die Arbeit an einem Multibinding, wird dies in einem leeren Ergebnis führen.
quelle
Ich bin mir bewusst, dass diese Frage jetzt alt ist, aber ich bin überrascht, dass niemand diese einfache Frage vorgeschlagen hat,
StringFormat
dieTimeSpan
direkt auf eine :quelle
WPF in .NET 4 hat jetzt eine Zeitspanne von Zeichenfolgen http://msdn.microsoft.com/en-us/library/ee372286.aspx
Ich benutze folgendes
<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
quelle
Wenn Sie StringFormat in einem Label verwenden möchten, das die Content-Eigenschaft verwendet, können Sie ContentStringFormat zum Formatieren Ihrer Zeitspanne verwenden:
quelle
Content
Eigenschaft verwenden (dh nicht dieText
Eigenschaft wie z. B. aTextBlock
),ContentStringFormat
muss die Eigenschaft verwendet werden. Die AngabeStringFormat
als Teil der Bindung funktioniert nicht.TimeSpan StringFormat mit Millisekunden:
quelle