Как преобразовать значение TimeSpan, которое является ItemsSource в ComboBox

У меня есть ObservableCollection LogTimeSpan, который содержит 5 значений.

this.LogTimeSpan.Add(TimeSpan.FromMinutes(1));
this.LogTimeSpan.Add(TimeSpan.FromMinutes(10));
this.LogTimeSpan.Add(TimeSpan.FromMinutes(60));
this.LogTimeSpan.Add(TimeSpan.FromHours(12));
this.LogTimeSpan.Add(TimeSpan.FromHours(24));

Я использую эту коллекцию как ItemsSource для ComboBox в WPF.

<ComboBox Name="cbLogTimeSpan" ItemsSource="{Binding LogTimeSpan}"
                Grid.Row="15" Grid.Column="1" Grid.ColumnSpan="2"
                />

Теперь мой ComboBox выглядит так:

Мой ComboBox

Я бы хотел получить ComboBox, который выглядит так:

  1. 1 минута
  2. 10 минут
  3. 1 час
  4. 12 часов
  5. 1 день

Что я могу сделать, чтобы преобразовать мои TimeSpan, чтобы они отображались в ComboBox, как описано выше?


person ck84vi    schedule 02.11.2015    source источник


Ответы (1)


Один из вариантов - использовать конвертер, который форматирует текст элементов:

<ComboBox ItemSource="{Binding LogTimeSpan}"
          Grid.Row="15"
          Grid.Column="1"
          Grid.ColumnSpan="2">
  <ComboBox.Resources>
    <ns:TimeSpanConverter x:Key="TimeSpanConverter" />
  </ComboBox.Resources>
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Path=., Mode=OneTime, Converter={StaticResource TimeSpanConverter}}" />
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

Где вы можете реализовать свой конвертер следующим образом

using System;
using System.Globalization;
using System.Windows.Data;

public class TimeSpanConverter : IValueConverter
{
  public object Convert(object value,
                        Type targetType,
                        object parameter,
                        CultureInfo culture)
  {
    // I am using following extension method here: http://stackoverflow.com/a/4423615/57508
    var timeSpan = (TimeSpan) value;
    var result = timeSpan.ToReadableString();
    return result;
  }

  public object ConvertBack(object value,
                            Type targetType,
                            object parameter,
                            CultureInfo culture)
  {
    throw new NotImplementedException();
  }
}

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

<ComboBox ItemSource="{Binding LogTimeSpan}"
          Grid.Row="15"
          Grid.Column="1"
          Grid.ColumnSpan="2">
  <ComboBox.Resources>
    <ns:TimeSpanConverter x:Key="TimeSpanConverter" />
  </ComboBox.Resources>
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Path=., Mode=OneTime, StringFormat={}{0:hh\\:mm\\:ss}}" />
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>
person Community    schedule 02.11.2015