根据今天的日期(WPF、DataGrid、C#)在通用列表中格式化日期

Format date in generic list based on todays date (WPF, DataGrid, C#)

我想将日期格式化为通用 List<T>。如果列表中当前项目的日期等于今天的日期,则日期格式应如下所示:

12.12.2015 12:34:56 //dd.MM.yyyy HH:MM:SS

如果不是,则日期格式应如下所示:

12.12.2015 //dd.MM.yyyy

代码看起来像这样:

private List<T> ConvertDate(List<T> inList)
{
    foreach (var item in inList)
    {
        if (item.Date == DateTime.Now)
            item.Date.ToString("dd.MM.yyyy HH:MM:SS");
        else
            item.Date.ToString("dd.MMMM.yyyy");
    }
    return inList;
}

我使用 C# 和 EF6 在 DataGrid 中显示它:

DataGrid.ItemsSource = ConvertDate(initList);

如何更新列表中的格式化日期?

编辑:

这是我的数据网格:

<DataGrid Name="DataGrid" AutoGenerateColumns="False" ...>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Date" Binding="{Binding Date}" ></DataGridTextColumn>
        ...
    </DataGrid.Columns>
  </DataGrid>

这是我用数据填充它的方式:

using (var context = new Context())
{
    List<Error> initList = context.Error.OrderByDescending(d => d.Date).Take(500).ToList();
    DataGrid.ItemsSource = ConvertDate(initList);
}

ToString() 的重载添加到您的项目 class。

public override string ToString()
{
    if (this.Date.Date == DateTime.Today) // ignore TimeOfDay
        return this.Date.ToString("dd.MM.yyyy HH:MM:SS");

    return this.Date.ToString("dd.MMMM.yyyy");
}

您可以在模型中使用转换器或计算的 属性。

有 属性 :

CS :

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    public List<Item> Items
    {
        get
        {
            var list = new List<Item>();

            list.Add(new Item{ Date =  DateTime.Now});
            list.Add(new Item { Date = DateTime.Now.AddDays(1) });

            return list;
        }
    }

}

public class Item
{
    public DateTime Date { get; set; }

    public string DisplayDate
    {
        get { return DateTime.Now.Date == Date.Date ? Date.ToString("dd.MM.yyyy HH:MM:SS") : Date.ToString("dd.MMMM.yyyy"); }
    }
}

XAML :

        <DataGrid ItemsSource="{Binding Items}" CanUserAddRows="False" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding DisplayDate, Mode=OneWay}"/>
        </DataGrid.Columns>
    </DataGrid> 

使用转换器:

CS:

      public class DateToDateFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        DateTime date = (DateTime) value;
        return DateTime.Now.Date == date.Date ? date.ToString("dd.MM.yyyy HH:MM:SS") : date.ToString("dd.MMMM.yyyy");
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML :

    <DataGrid ItemsSource="{Binding Items}" CanUserAddRows="False" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Date, Mode=OneWay, Converter={StaticResource dateFormatConverter}}"/>
        </DataGrid.Columns>
    </DataGrid>

您需要 converter 才能实现:

XAML:

<Window //...
    xmlns:c="clr-namespace:YOURNAMESPACE"
    //...
>

<Window.Resources>
    <c:DateToCustomDate x:Key="converter" />
    //...
</Window.Resources>

C#:

namespace ExceptionLogViewer
{
    public class DateToCustomDate : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is DateTime)
            {
                var date = (DateTime)value;
                if (date == DateTime.Today)
                {
                    return string.Format("{0:d} {0:t}", date);
                }
                else
                {
                    return string.Format("{0:d}", date);
                }
            }
            else
            {
                return value;
            }
        }


        object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}