C# C中WPF数据网格的可变日期格式#
我在C# C中WPF数据网格的可变日期格式#,c#,wpf,datagrid,C#,Wpf,Datagrid,我在列表中有一个DateTime字段,用作WPFDataGrid中的ItemSource,我希望根据值设置不同的格式 如果DateTime值在DateTime.Now的一年之内,我想使用'MMM dd hh:mm'作为格式,如果它超过了DateTime.Now的一年,我想使用'MMM dd yyyy'作为格式,如果正好是DateTime.MinValue,然后希望数据网格中的单元格为空 这是我所拥有的代码,目前仅以'MMM dd hh:mm'格式显示日期 是否可以直接在XAML中定义此变量格式
列表中有一个DateTime
字段,用作WPFDataGrid
中的ItemSource
,我希望根据值设置不同的格式
如果DateTime
值在DateTime.Now
的一年之内,我想使用'MMM dd hh:mm'
作为格式,如果它超过了DateTime.Now
的一年,我想使用'MMM dd yyyy'
作为格式,如果正好是DateTime.MinValue
,然后希望数据网格中的单元格为空
这是我所拥有的代码,目前仅以'MMM dd hh:mm'
格式显示日期
是否可以直接在XAML中定义此变量格式
如果没有,如何在DataGrid_加载的事件中以编程方式修补格式
public class DeadlineItem
{
public string Name { get; set; }
public DateTime Deadline {get; set; }
public DeadlineItem(string aName, DateTime aDeadline)
{
this.Name = aName;
this.Deadline = aDeadline;
}
}
private void DataGrid_Loaded(object sender, RoutedEventArgs e)
{
var items = new List<DeadlineItem>();
items = new List<DeadlineItem>();
items.Add(new DeadlineItem("Distant deadline", DateTime.Now.AddDays(500)));
items.Add(new DeadlineItem("Near Deadline", DateTime.Now.AddDays(1)));
items.Add(new DeadlineItem("No Deadline", DateTime.MinValue));
// ... Assign ItemsSource of DataGrid.
var grid = sender as DataGrid;
grid.ItemsSource = items;
}
public类DeadlineItem
{
公共字符串名称{get;set;}
公共日期时间截止日期{get;set;}
公共DeadlineItem(字符串aName、日期时间aDeadline)
{
this.Name=aName;
这个.Deadline=aDeadline;
}
}
已加载私有void数据网格(对象发送方,RoutedEventArgs e)
{
var items=新列表();
项目=新列表();
items.Add(新的DeadlineItem(“遥远的截止日期”,DateTime.Now.AddDays(500));
items.Add(新的DeadlineItem(“接近截止日期”,DateTime.Now.AddDays(1));
添加(新的DeadlineItem(“无截止日期”,DateTime.MinValue));
//…分配DataGrid的ItemsSource。
var grid=发送方作为数据网格;
grid.ItemsSource=项目;
}
XAML是:
<DataGrid
AutoGenerateColumns="False"
HorizontalAlignment="Left"
Margin="0,0,0,0"
VerticalAlignment="Top"
Loaded="DataGrid_Loaded">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Deadline" Binding="{Binding Deadline, StringFormat=\{0:MMM dd HH:mm\}}" />
</DataGrid.Columns>
</DataGrid>
正如Eugene提到的,您需要使用转换器。首先,您需要添加一个类,该类实现:
现在,您需要在xaml文件中引用转换器。比如:
<Window.Resources>
<TestWpf:DateTimeFormatConverter x:Key="DateTimeFormatConverter"></TestWpf:DateTimeFormatConverter>
</Window.Resources>
最后,您将更改绑定以使用转换器:
<DataGrid
AutoGenerateColumns="False"
HorizontalAlignment="Left"
Margin="0,0,0,0"
VerticalAlignment="Top"
Loaded="DataGrid_Loaded">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Deadline" Binding="{Binding Deadline, Converter={StaticResource DateTimeFormatConverter}}" />
</DataGrid.Columns>
</DataGrid>
您不必担心排序问题,datagrid将根据基础日期而不是格式化字符串进行排序。我是WPF新手(今天下午才开始使用它),所以我仍然缺少一些要点。这是正在进行的类型转换吗?它是否会影响DataGrid按截止日期列的排序(升序/降序)?您可以找到一些信息或。是的,我没有考虑过,但它会影响排序,因为列将包含字符串,而不是日期时间。尽管如此,您可以尝试与适当的模板和相同的转换器一起使用-应该可以正常工作?它是xaml的代码隐藏.cs文件中“namespace TestWpf”中的应用程序名称空间吗?如果我输入我的应用程序名称空间名称,我会得到一个“nameprefix not defined”错误。我刚刚发现我需要向元素添加一个xmlns:TestWpf=“clr namespace:WpfApplication1”属性。@Pep,是的,TestWpf只是我用来测试代码的项目的名称空间。您可以将其命名为适合您的项目的名称。@WyattEarp谢谢!我有一个类似的问题,我最终使用了这样的解决方案。。。但也值得注意的是,如果可能的话,如果您自己构建数据集,人们也可以在源代码处使用.ToString('FormatSpecifier')。如下所示:
<DataGrid
AutoGenerateColumns="False"
HorizontalAlignment="Left"
Margin="0,0,0,0"
VerticalAlignment="Top"
Loaded="DataGrid_Loaded">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Deadline" Binding="{Binding Deadline, Converter={StaticResource DateTimeFormatConverter}}" />
</DataGrid.Columns>
</DataGrid>