C# WPF 数据网格格式时间跨度

C# WPF datagrid format timespan

我正在尝试以编程方式将列表中的数据绑定到 WPF 中的 GridView。 它工作得很好,但我想根据需要格式化 TimeSpan 列,但是当我使用任何 StringFormat 时,该列只是保持为空。

我有以下(简化的)代码:

foreach (var song in _manager.GetLibrarySongs())
{
    LibraryView.Items.Add(song);
}

DataGridTextColumn durationColumn = new DataGridTextColumn
{
    Header = "Duration",
    Binding = new Binding("Duration") { StringFormat = "" }
};
LibraryView.Columns.Add(durationColumn);

Stringformat 在这里是空的,但无论我在那里输入什么,它都会使该列为空。我尝试了 "hh\:mm\:ss"、"hh\:mm\:ss"、“{}{0:g}”、...

有谁知道我做错了什么? 提前致谢!

以下代码已在 Visual Studio 2015 年使用,并且具有具有已定义格式的 DateTime 和 TimeSpan 列的 DataGrid。

对于日期,使用以下字符串 "yyyy-MM-dd" 而对于时间字符串 "mm\:ss" 使用(注意双反斜杠)

public partial class MainWindow : Window {
    public MainWindow() {
        InitializeComponent();

        dataGrid = new DataGrid();

        var stackPanel = new StackPanel { Orientation = Orientation.Vertical };
        stackPanel.Children.Add(dataGrid);

        Content = stackPanel;

        Rnd = new Random();
        Now = DateTime.Now;
        Counter = 1;

        foreach (var song in GetSongs())
            dataGrid.Items.Add(song);

        // var timeSpanConverter = new TimeSpanConverter();
        var titleColumn = new DataGridTextColumn { Header = "Title", Binding = new Binding("Title") };
        var authorColumn = new DataGridTextColumn { Header = "Author", Binding = new Binding("Author") };
        var albumColumn = new DataGridTextColumn { Header = "Album", Binding = new Binding("Album")};
        // var durationColumn = new DataGridTextColumn {Header = "Duration", Binding = new Binding("Duration") { Converter = timeSpanConverter }   };
        var durationColumn = new DataGridTextColumn { Header = "Duration", Binding = new Binding("Duration") { StringFormat = "mm\:ss" } };
        var releaseColumn = new DataGridTextColumn { Header = "Release", Binding = new Binding("Release") { StringFormat = "yyyy-MM-dd" } };

        dataGrid.Columns.Add(titleColumn);
        dataGrid.Columns.Add(authorColumn);
        dataGrid.Columns.Add(albumColumn);
        dataGrid.Columns.Add(durationColumn);
        dataGrid.Columns.Add(releaseColumn);
    }

    private DataGrid dataGrid;

    private int? Counter;
    private DateTime? Now;
    private Random Rnd;

    private TimeSpan GetDuration() { return TimeSpan.FromSeconds(30 + Rnd.Next(500)); }
    private DateTime GetRelease() { Counter += 1; return Now.Value.AddMilliseconds(Counter.Value); }
    private string GetTitle() { return $"Title {Counter}"; }
    private string GetAlbum() { return $"Album {Counter}"; }
    private string GetAuthor() { return $"Author {Counter}"; }

    private IList<Song> GetSongs()
    {
        var list = new List<Song>();

        for(var i = 0; i < 1000; i++)
            list.Add(new Song() {
                Title = GetTitle(),
                Album = GetAlbum(),
                Author = GetAuthor(),
                Release = GetRelease(),
                Duration = GetDuration()
            });
        return list;
    }
}

public class Song {
    public string Title { get; set; }
    public string Author { get; set; }
    public string Album { get; set; }
    public DateTime Release { get; set; }
    public TimeSpan Duration { get; set; }
}

public class TimeSpanConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        return ((TimeSpan)value).ToString("mm\:ss");
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotImplementedException();
    }
}

如果使用 StringFormat 的方法不起作用(不应该是这种情况),您可以尝试使用 Converter 的方法(在 Duration 列的代码中注释)