在ObservableCollection中显示格式化的DateTime

时间:2018-09-06 07:07:46

标签: c# date datetime parsing time

进入DataGrid,我有2列:

public string DayName {get; set;}    
public DateTime DateTimeColumn {get; set;}

我要显示以下数据:

DayName   | DateTimeColumn  
Monday    | 2018-09-03 
Tuesday   | 2018-09-04 
Wednesday | 2019-09-05 
....

为此,我有方法:

public static ObservableCollection<MyDataConcept> BuildDataConceptList(int year, int month)
{
   ObservableCollection<MyDataConcept> resultList = 
                                          new ObservableCollection<MyDataConcept>();

  foreach (var data in GetDates(year, month))
  {
    if (data.DayOfWeek.ToString() != "Saturday" && data.DayOfWeek.ToString() != "Sunday")
    {
     MyDataConcept kdc = new MyDataConcept(data.DayOfWeek.ToString(), data.Date);
     resultList.Add(kdc);
    }
  }
}

我没有显示DayName = data.DayOfWeek.ToString()的问题,只需显示正确的DateTimeColumn = data.Date ,因为它现在显示为:09/03/2018 12:00:00 AM

我试图进行如下转换:

DateTime time = DateTime.Parse(data.ToShortDateString());

var date = System.DateTime.ParseExact(data.ToShortDateString(), "yyyy-MM-dd", 
           CultureInfo.InvariantCulture,DateTimeStyles.None);

但是它不起作用。

更新:  这是我的XAML:

<DataGrid ItemsSource="{Binding Path=MyConceptItems}"
IsSynchronizedWithCurrentItem="True" />

1 个答案:

答案 0 :(得分:1)

问题是您将DateTime转换为DateTime。然后,格式化消失了。尝试使用字符串:

var date = data.ToShortDateString();

如果您真的想在DataGrid中使用DateTime,则只需对列进行XAML定义:

<DataGridTextColumn Binding="{Binding DateTimeColumn, StringFormat=\{0:yyyy-MM-dd\}}" />

如果列是自动生成的,即XAML中没有列定义,则可以处理数据网格的事件AutoGeneratingColumn:

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyType == typeof(DateTime))
    {
        e.Column = new DataGridTextColumn()
        {
            Binding = new Binding(e.PropertyName) { StringFormat = "yyyy-MM-dd" }
        };
    }
}

在XAML中:

<DataGrid ItemsSource="{Binding Path=MyConceptItems}" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn" IsSynchronizedWithCurrentItem="True" />