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 列的代码中注释)
我正在尝试以编程方式将列表中的数据绑定到 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 列的代码中注释)