Saya mencoba memformat textblock yang terikat ke TimeSpan
properti. Ia bekerja jika properti bertipe DateTime
tetapi gagal jika itu adalah TimeSpan
. Saya bisa menyelesaikannya menggunakan konverter. Tetapi saya mencoba mencari tahu apakah ada alternatif lain.
Kode sampel:
public TimeSpan MyTime { get; set; }
public Window2()
{
InitializeComponent();
MyTime = DateTime.Now.TimeOfDay;
DataContext = this;
}
Xaml
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Saya mengharapkan textblock hanya menampilkan jam dan menit. Tapi itu ditampilkan sebagai:
19: 10: 46.8048860
Jawaban:
Di .NET 3.5 Anda bisa menggunakan MultiBinding sebagai gantinya
Perbarui
Untuk menjawab komentar.
Untuk memastikan Anda mengeluarkan 2 digit meskipun jam atau menit adalah 0-9 Anda dapat menggunakan {0:00} alih-alih {0}. Ini akan memastikan output untuk waktu 12:01 adalah 12:01, bukan 12: 1.
Jika Anda ingin menghasilkan 01:01 sebagai 1:01 gunakan
StringFormat="{}{0}:{1:00}"
Dan pemformatan bersyarat dapat digunakan untuk menghilangkan tanda negatif selama beberapa menit. Alih-alih {1:00} kita dapat menggunakan {1: 00; 00}
sumber
.Hours
ke.Minutes
TotalMinutes
bukanMinutes
sebagai bagian menit (untuk menunjukkan rentang waktu terlama 1 jam itu). TetapiTotalMinutes
properti dalam format ganda, jadi mengikat menggunakan<Binding Path="MyTime.TotalMinutes" />
menghasilkan keluaran bulat, yang buruk - saya perlu menunjukkan nilai terpotong daripada dibulatkan. Dimungkinkan untuk mencapainya tanpa menggunakan coneverter nilai kustom untuk memotong double ke int?Format string dimaksudkan untuk bekerja pada a
DateTime
, bukan aTimeSpan
.DateTime.Now
Sebagai gantinya, Anda dapat mengubah kode Anda untuk digunakan . Xaml Anda baik-baik saja:Memperbarui
Dan dari .Net 4 format a
TimeSpan
sebagai berikut:sumber
Hanya untuk menambahkan ke kumpulan, saya berhasil menggunakan pengikatan ini untuk menampilkan TimeSpan di aplikasi WPF produksi:
Mengambil beberapa percobaan untuk mendapatkan garis miring terbalik dengan benar :)
sumber
StringFormat
harus dalam bentuk string format. Dalam hal ini akan terlihat seperti:Catatan: jika Anda ingin menampilkan jumlah total jam dan menit dan rentang waktunya lebih dari 24 jam, ada peringatan dengan pendekatan Anda: Berikut solusinya .
sumber
Untuk Multi binding, Anda perlu memperhatikan sejak .NET 4.
Gambaran singkat di bawah ini, diuji dengan .NET 4.6:
Penjilidan biasa:
Multi mengikat:
atau Anda dapat menggunakan " alih-alih ' dalam multi-binding:
Catatan: menggunakan StringFormat = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" tidak akan berfungsi pada MultiBinding, ini akan menghasilkan hasil kosong.
sumber
Saya sadar bahwa pertanyaan ini sudah tua sekarang, tetapi saya terkejut bahwa tidak ada yang menyarankan hal sederhana ini
StringFormat
yang akan bekerja secaraTimeSpan
langsung:sumber
WPF di .NET 4 sekarang memiliki rentang waktu dari string http://msdn.microsoft.com/en-us/library/ee372286.aspx
Saya menggunakan yang berikut ini
<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
sumber
Jika Anda ingin menggunakan StringFormat dalam Label yang menggunakan properti Konten, Anda dapat menggunakan ContentStringFormat untuk memformat rentang waktu Anda:
sumber
Content
properti (yaitu, bukanText
properti karena, misalnya, aTextBlock
), propertiContentStringFormat
harus digunakan. MenentukanStringFormat
sebagai bagian dari pengikatan tidak akan berfungsi.TimeSpan StringFormat dengan milidetik:
sumber