Я пытаюсь отформатировать текстовый блок, привязанный к 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}"/>
Я ожидаю, что в текстовом блоке будут отображаться только часы и минуты. Но это отображается как:
19: 10: 46.8048860
Ответы:
В .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>
источник
.Hours
как и к.Minutes
TotalMinutes
а неMinutes
как часть минут (чтобы показать самые длинные промежутки времени, что 1 час). НоTotalMinutes
свойство имеет двойной формат, поэтому привязка с использованием<Binding Path="MyTime.TotalMinutes" />
дает округленный вывод, что плохо - мне нужно отображать усеченное значение вместо округленного. Можно ли добиться этого без использования специального преобразователя значений для усечения double до int?Строка формата предназначена для работы с
DateTime
файломTimeSpan
.DateTime.Now
Вместо этого вы можете изменить свой код для работы . Ваш xaml в порядке:<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Обновить
А из .Net 4 форматировать
TimeSpan
следующим образом:<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>
источник
Просто чтобы добавить в пул, я успешно использую эту привязку для отображения TimeSpan в производственном приложении WPF:
Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"
Принял несколько попыток исправить обратную косую черту :)
источник
StringFormat
должен быть в виде строки формата. В этом случае это будет выглядеть так:<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>
Примечание: если вы хотите отобразить общее количество часов и минут, а временной интервал превышает 24 часа, есть предостережение в отношении вашего подхода: вот обходной путь .
источник
На привязки Multi нужно обращать внимание, начиная с .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, это приведет к пустому результату.
источник
Я знаю, что это старый вопрос, но я удивлен, что никто не предложил этот простой,
StringFormat
который будет работатьTimeSpan
напрямую:<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
источник
WPF в .NET 4 теперь имеет временной промежуток из строк http://msdn.microsoft.com/en-us/library/ee372286.aspx
Я использую следующие
<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
источник
Если вы хотите использовать StringFormat в метке, которая использует свойство Content, вы можете использовать ContentStringFormat для форматирования своего временного интервала :
<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"
источник
Content
свойство (т. Е. НеText
свойство, как, например, aTextBlock
), свойствоContentStringFormat
должно использоваться. УказатьStringFormat
как часть привязки не получится.TimeSpan StringFormat с миллисекундами:
<TextBlock Text="{Binding MyTime, StringFormat=\{0:hh\\:mm\\:ss\\.fff\}}"/>
источник