Я пытаюсь отформатировать текстовый блок, привязанный к свойству TimeSpan
. Он работает, если свойство имеет тип DateTime
, но он терпит неудачу, если он равен TimeSpan
. Я могу сделать это с помощью конвертера. Но я пытаюсь выяснить, есть ли альтернативы.
Пример кода:
public TimeSpan MyTime { get; set; }
public Window2()
{
InitializeComponent();
MyTime = DateTime.Now.TimeOfDay;
DataContext = this;
}
Xaml
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Я ожидаю, что текстовый блок покажет только часы и mintes. Но он отображается как:
19: 10: 46,8048860
Ответ 1
В .NET 3.5 вы можете использовать MultiBinding вместо
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}:{1}">
<Binding Path="MyTime.Hours"/>
<Binding Path="MyTime.Minutes"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Обновление
Чтобы ответить на комментарии.
Чтобы вывести 2 цифры, даже если часы или минуты 0-9, вы можете использовать {0:00} вместо {0}. Это позволит убедиться, что результат на время 12:01 составляет 12:01 вместо 12: 1.
Если вы хотите вывести 01:01 как 1:01, используйте StringFormat="{}{0}:{1:00}"
И Условное форматирование можно использовать для удаления отрицательного знака в течение нескольких минут. Вместо {1:00} мы можем использовать {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>
Ответ 2
Строка формата предназначена для работы с DateTime
, а не с TimeSpan
.
Вместо этого вы можете изменить свой код для работы с DateTime.Now
. Ваш xaml в порядке:
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Обновление
И из .NET 4 формат a TimeSpan
следующим образом:
<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>
Ответ 3
Просто чтобы добавить в пул, я успешно использую эту привязку для отображения TimeSpan в рабочем приложении WPF:
Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"
Взял некоторые попытки получить обратную косую черту справа:)
Ответ 4
StringFormat
должен быть в форме строки формата. В этом случае это будет выглядеть так:
<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>
Примечание. Если вы хотите отобразить общее количество часов и минут, а период времени больше 24 часов, оставьте свой комментарий: Здесь обходной путь.
Ответ 5
Для многопоточных привязок вам нужно обратить внимание с .NET 4.
Краткий обзор ниже, протестированный с помощью .NET 4.6:
Регулярное связывание:
<TextBlock Text="{Binding Start, StringFormat='{}{0:hh\\:mm\\:ss}'}" />
Многосвязность:
<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>
или вы можете использовать " вместо ' в мультисвязности:
<MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'>
Примечание:
используя StringFormat = "{} {0: hh \: \: mm \: ss} → {1: hh \: mm \: ss}" будет работать не в MultiBinding, это приведет к в чистом виде.
Ответ 6
WPF в .NET 4 теперь имеет временные рамки из строк http://msdn.microsoft.com/en-us/library/ee372286.aspx
Я использую следующий <TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
Ответ 7
Я знаю, что этот вопрос старый, но я удивлен, что никто не предложил этот простой StringFormat
, который будет работать непосредственно с TimeSpan
:
<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
Ответ 8
Если вы хотите использовать StringFormat в ярлыке, который использует свойство Content, вы можете использовать ContentStringFormat для форматирования вашего времени:
<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"
Ответ 9
Обыскав многочисленные темы с этой проблемой, я обнаружил, что: с 4 июля 2019 года это работает для меня в XAML в формах Xamarin:
Text = "{Binding myTimeSpan, StringFormat = {0: h \: mm \: ss}, FallbackValue = 00: 00: 00}
Отображает время в часах, минутах, секундах:
1 час 23 минуты и 9 секунд = 1:23:09