2017-05-03 69 views
0

我试图以编程方式将列表中的数据绑定到WPF中的GridView。 它完美的工作,但我想格式化一个TimeSpan列以满足我的需求,但是当我使用任何StringFormat时,该列只保留为空。C#WPF数据网格格式时间范围

我有以下(简化)代码:

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}”,...

有谁知道我在做什么错误? 在此先感谢!

+0

仅仅因为我在答案中很有趣。为什么不在xaml中做? –

+0

@MightyBadaboom我打算让用户选择显示哪些列,但我不确定是否我最终会这样做,或者只是绑定xaml中的所有列,然后隐藏列。我只是想这样玩弄它。 – JC97

回答

1

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

对于日期以下字符串用于 “YYYY-MM-DD” 而对于时间字符串 “毫米\: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方法是不工作(不应该是这种情况),你可以尝试与转换器的方法(评论代码为持续时间栏)