Как форматировать TimeSpan в XAML

Я пытаюсь отформатировать textblock, который привязан к 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}"/>

Я ожидаю, что textblock покажет только часы и мяты. Но это показывает, как:

19:10:46.8048860

8 ответов


в .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>

строка формата предназначена для работы с DateTime, а не TimeSpan.

вы можете изменить свой код для работы с . Ваш xaml в порядке:

<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>

обновление

и от .Net 4 формат a 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 часа, есть предостережение с вашим подходом:вот решение.


для нескольких Привязок вам нужно обратить внимание с .NET 4.

краткий обзор ниже, протестирован с .NET 4.6:

обычная привязка:

<TextBlock Text="{Binding Start, StringFormat='{}{0:hh\:mm\:ss}'}" />

Multi binding:

<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:

<MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'>

Примечание.: используя StringFormat= " {} {0: hh\:\: mm\: ss} -> {1:hh\: mm\: ss}" будет не работа на MultiBinding, это приведет к пустому результату.


WPF в .NET 4 теперь имеет timespan из строк http://msdn.microsoft.com/en-us/library/ee372286.aspx

Я использую следующее <TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />


Я знаю, что этот вопрос уже старый, но я удивлен, что никто не предложил этот простой StringFormat который будет работать на TimeSpan напрямую:

<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>

Если вы хотите использовать StringFormat в метке, использующей свойство Content, вы можете использовать ContentStringFormat для форматирования timespan:

<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"