Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中WPF数据网格的可变日期格式#_C#_Wpf_Datagrid - Fatal编程技术网

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
字段,用作WPF
DataGrid
中的
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>