Как отформатировать TimeSpan в XAML - PullRequest
84 голосов
/ 30 декабря 2010

Я пытаюсь отформатировать текстовый блок, привязанный к свойству 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

Ответы [ 8 ]

132 голосов
/ 30 декабря 2010

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

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

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

Обновление

А из .Net 4 форматировать TimeSpan следующим образом:

<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>
84 голосов
/ 30 декабря 2010

В .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>
38 голосов
/ 08 декабря 2011

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

Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"

Сделал несколько попыток, чтобы получить правильную обратную косую черту:)

21 голосов
/ 30 декабря 2010

StringFormat должно быть в форме строки формата. В этом случае это будет выглядеть так:

<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>

Примечание: если вы хотите отобразить общее количество часов и минут, а временной интервал превышает 24 часа, есть подход с вашим подходом: Вот обходной путь .

14 голосов
/ 22 октября 2015

Для мульти-привязок нужно обратить внимание, начиная с .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: чч \: \: мм \: сс} -> {1: чч \: мм \: сс}" будет не работать на MultiBinding, это приведет к пустому результату.

12 голосов
/ 27 декабря 2011

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

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

10 голосов
/ 12 октября 2013

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

<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
6 голосов
/ 23 мая 2016

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

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