C# 如何为通过ItemsSource方法填充值的WPF数据网格中的特定列设置StringFormat

C# 如何为通过ItemsSource方法填充值的WPF数据网格中的特定列设置StringFormat,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,我有一个WPF数据网格,其值通过ItemsSource方法填充 我将如何着手做一些类似于下面代码的事情,以使其格式合理?还有一种方法可以简单地从源表继承StringFormat吗 <DataGridTextColumn Binding="{Binding Path=Date, StringFormat=d}" Header="Date" /> <DataGridTextColumn Binding="{Binding Path=Amount, StringFormat=C}"

我有一个WPF数据网格,其值通过ItemsSource方法填充

我将如何着手做一些类似于下面代码的事情,以使其格式合理?还有一种方法可以简单地从源表继承StringFormat吗

<DataGridTextColumn Binding="{Binding Path=Date, StringFormat=d}" Header="Date" />
<DataGridTextColumn Binding="{Binding Path=Amount, StringFormat=C}" Header="Amount"/>

该表是通过以下代码生成的:

<DataGrid x:Name="datatable" ItemsSource="{Binding SubVwr.Tables[0].Tbl}"/>

假设列是自动填充的,我建议创建一个附加行为,订阅
自动生成列
事件,检查要绑定的属性,并指定默认格式

您可以在
[DataType]
属性中查找提示,如果找不到任何提示,请根据列的数据类型选择一个合理的默认值:

使用System.ComponentModel.DataAnnotations.dll //#使用System.Windows.Interactivity.dll 公共类AutoColumnFormatBehavior:行为 { 受保护的覆盖无效附加() { base.onatached(); this.AssociatedObject.AutoGeneratingColumn+=OnAutoGeneratingColumn; } 附加时受保护的覆盖无效() { base.OnDetaching(); this.AssociatedObject.AutoGeneratingColumn-=OnAutoGeneratingColumn; } 自动生成列上的私有void( 对象发送器, DataGrid自动生成ColumnEventArgs(e) { var binding=(例如,列作为DataGridBoundColumn)?.binding; if(binding!=null&&binding.StringFormat==null) binding.StringFormat=GetFormat(e.PropertyType,e.PropertyDescriptor); } 私有静态字符串GetFormat(类型,对象描述符) { var属性=默认值(DataTypeAttribute); if(描述符为MemberInfo mi) attribute=mi.GetCustomAttribute(); else if(描述符为MemberDescriptor md) attribute=md.Attributes[typeof(DataTypeAttribute)]作为DataTypeAttribute; var typeCode=GetTypeCode(类型);
var isNumericType=typeCode>=typeCode.SByte&&typeCode您需要做的是使用自动生成列

private void datagrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    DataGridTextColumn col = e.Column as DataGridTextColumn;
    if (col != null && e.PropertyType == typeof(double))
    {
        if (!col.Header.ToString() == "Amount")
            col.Binding = new Binding(e.PropertyName) { StringFormat = "N0" };
        else
            col.Binding = new Binding(e.PropertyName) { StringFormat = "N2" };
    }
}

您还可以通过检查col.Header.ToString()来定义每个列所需的格式。

当您说“谁的值已填充”时,您的意思是自动填充列?列和行。所有内容。我将发布生成表的代码