C# 如何为通过ItemsSource方法填充值的WPF数据网格中的特定列设置StringFormat
我有一个WPF数据网格,其值通过ItemsSource方法填充 我将如何着手做一些类似于下面代码的事情,以使其格式合理?还有一种方法可以简单地从源表继承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}"
<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()来定义每个列所需的格式。当您说“谁的值已填充”时,您的意思是自动填充列?列和行。所有内容。我将发布生成表的代码