簡體   English   中英

C#WPF DataGrid格式時間跨度

[英]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中使用,並且DataGrid的DateTime和TimeSpan列具有定義的格式。

對於日期,使用字符串“ 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列的代碼中進行了注釋)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM