C# WPF数据网格中的日期格式

C# WPF数据网格中的日期格式,c#,wpf,datagrid,date-formatting,C#,Wpf,Datagrid,Date Formatting,我想将日期列的格式从“DD/MM/YYYY HH:MM:SS”更改为“DD.MM.YYYY” 不幸的是,该代码抛出了一个XMLParseException 首先,在使用AutoGenerateColumns时,这种解决方法是否可行? 如果没有,我还能怎么处理 如果是,上面的代码有什么问题?不要忘记使用DataGrid.Columns,所有列都必须在该集合中。 在我的项目中,我的日期格式有点不同: <tk:DataGrid> <tk:DataGrid.Columns&

我想将日期列的格式从“DD/MM/YYYY HH:MM:SS”更改为“DD.MM.YYYY”


不幸的是,该代码抛出了一个
XMLParseException

首先,在使用AutoGenerateColumns时,这种解决方法是否可行? 如果没有,我还能怎么处理


如果是,上面的代码有什么问题?

不要忘记使用DataGrid.Columns,所有列都必须在该集合中。 在我的项目中,我的日期格式有点不同:

<tk:DataGrid>
    <tk:DataGrid.Columns>
        <tk:DataGridTextColumn Binding="{Binding StartDate, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" />
    </tk:DataGrid.Columns>
</tk:DataGrid>


使用AutoGenerateColumns,您将无法控制格式,因为DataGird将添加自己的列。

如果绑定属性是DateTime,则只需

Binding={Property, StringFormat=d}

很晚才来这里参加聚会,但万一有人无意中看到这一页

可以通过在XAML中设置AutoGeneratingColumn处理程序来实现:

<DataGrid AutoGeneratingColumn="OnAutoGeneratingColumn"  ..etc.. />

我知道公认的答案很古老,但有一种方法可以通过AutoGenerateColumns控制格式:

首先创建一个函数,该函数将在生成列时触发:

<DataGrid x:Name="dataGrid" AutoGeneratedColumns="dataGrid_AutoGeneratedColumns" Margin="116,62,10,10"/>

首先选择datagrid,然后转到“属性”“查找datagrid_自动生成列”,然后双击 然后使用这个代码

   Datagrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
            {
                if (e.PropertyName == "Your column name")
                    (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MMMMMMMMM/yyyy";
                if (e.PropertyName == "Your column name")
                    (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MMMMMMMMM/yyyy";
            }

我试着在WPF上使用它这是一个非常古老的问题,但我找到了一个新的解决方案,所以我写了它

Binding="{Binding YourColumn ,StringFormat='yyyy-MM-dd'}"
首先,在使用AutoGenerateColumns时,这种解决方法是否可行

是的,这可以通过以下附件属性完成


附加属性 定义了两个AttachedProperty,允许您指定两种格式。
datetimeformatutogenerate
用于
DateTime
TimeSpan格式自动生成
用于
TimeSpan

类DataGridOperation
{
公共静态字符串GetDateTimeFormatAutoGenerate(DependencyObject obj)=>(字符串)obj.GetValue(DateTimeFormatAutoGenerateProperty);
公共静态void SetDateTimeFormatAutoGenerate(DependencyObject对象,字符串值)=>obj.SetValue(DateTimeFormatAutoGenerateProperty,值);
公共静态只读从属属性DateTimeFormatAutoGenerateProperty=
DependencyProperty.RegisterAttached(“DateTimeFormatAutoGenerate”、typeof(string)、typeof(DataGridOperation),
新的PropertyMetadata(null,(d,e)=>AddEventHandle生成(d,e));
公共静态字符串GetTimeSpanFormatAutoGenerate(DependencyObject obj)=>(字符串)obj.GetValue(TimeSpanFormatAutoGenerateProperty);
公共静态void SetTimeSpanFormatAutoGenerate(DependencyObject对象,字符串值)=>obj.SetValue(TimeSpanFormatAutoGenerateProperty,值);
公共静态只读从属属性TimeSpanFormatAutoGenerateProperty=
DependencyProperty.RegisterAttached(“TimeSpanFormatAutoGenerate”、typeof(string)、typeof(DataGridOperation),
新的PropertyMetadata(null,(d,e)=>AddEventHandle生成(d,e));
私有静态void AddEventHandlerOnGenerating(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
如果(!(d是DataGrid dGrid))
返回;
if((e.NewValue为字符串格式))
dGrid.AutoGeneratingColumn+=(o,e)=>AddFormat_OnGenerating(e,format);
}
私有静态void AddFormat_OnGenerating(DataGridAutoGeneratingColumnEventArgs e,字符串格式)
{
如果(e.PropertyType==typeof(T))

(e.Column作为DataGridTextColumn)。Binding.StringFormat=格式; } }
如何使用 看法

视图模型
公共类MainWindowViewModel
{
公共日期对[]日期{get;}=新日期对[]
{
new(){StartDate=new(2011,1,1),EndDate=new(2011,2,1)},
new(){StartDate=new(2020,1,1),EndDate=new(2021,1,1)},
};
}
公共类日期对
{
公共日期时间起始日期{get;set;}
公共日期时间结束日期{get;set;}
公共时间跨度=>EndDate-StartDate;
}

好的,谢谢你!是否可以在我的项目中没有属性的情况下将列绑定到数据库外的字段?@Harald,不,您不能直接绑定到数据库字段,首先您必须创建或生成一些对象(例如,使用)。如果您已经有了这样一个对象的集合,那么您可以将其绑定到DataGrid.ItemsSource属性,就像您在代码中所做的那样。非常感谢!这个帖子救了我@Kiquenet,如果您对每个区域性都有一些自定义格式,那么最好将该逻辑移到转换器或属性获取程序。否则,您可以使用@KonradViltersten查看更多选项,它是应用时使用的索引。这很酷,我喜欢从文本文件加载数据并在运行时设置类型。太棒了!如果您需要VB.NET版本:私有子MyGrid_AutoGeneratingColumn(发件人作为对象,e作为DataGridAutoGeneratingColumnEventArgs)处理MyGrid.AutoGeneratingColumn,如果e.PropertyType=GetType(System.DateTime),则处理TryCast(e.Column,DataGridTextColumn)。Binding.StringFormat=“dd/MM/yyyy”如果结束,则结束使用autogeneratecolumns(例如,列作为DataGridTextColumn)。Binding.StringFormat=“d”//使用短日期格式我将使用
DataGridBoundColumn
而不是
DataGridTextColumn
更为通用。请添加对代码的解释,这将大大提高答案的质量。虽然我在项目中使用Mark Feldman,当您具有相同类型的不同属性,并且希望每个属性具有不同的格式时,您的解决方案非常有用。Mark Feldman已经回答了这一问题。
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if(YourColumn == typeof(DateTime))
            {
                e.Column.ClipboardContentBinding.StringFormat = "d";
            }
        }
   Datagrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
            {
                if (e.PropertyName == "Your column name")
                    (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MMMMMMMMM/yyyy";
                if (e.PropertyName == "Your column name")
                    (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MMMMMMMMM/yyyy";
            }
Binding="{Binding YourColumn ,StringFormat='yyyy-MM-dd'}"