C# “显示”;显示名称";而不是WPF数据网格中的字段名

C# “显示”;显示名称";而不是WPF数据网格中的字段名,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,这是我的类定义 public class Customer { [Display(Name="Customer ID")] public int ID { get; set; } [Display(Name="Customer Name")] public string CusName { get; set; } } 这是我的XAML代码 这就是数据绑定 public Test() {

这是我的类定义

    public class Customer
    {
        [Display(Name="Customer ID")]
        public int ID { get; set; }
        [Display(Name="Customer Name")]
        public string CusName { get; set; }
    }
这是我的XAML代码

这就是数据绑定

    public Test()
    {
        InitializeComponent();


        List<Customer> cus = new List<Customer>();
        cus.Add(new Customer() { ID = 1, CusName = "Jackson" });
        cus.Add(new Customer() { ID = 2, CusName = "Micheal" });
        cus.Add(new Customer() { ID = 3, CusName = "Jackson" });
        DataGrid.ItemsSource = cus;
    }
公共测试()
{
初始化组件();
List cus=新列表();
添加(新客户(){ID=1,CusName=“Jackson”});
添加(新客户(){ID=2,CusName=“Micheal”});
添加(新客户(){ID=3,CusName=“Jackson”});
DataGrid.ItemsSource=cus;
}
结果是:

DataGrid头列显示ID、CusName,它们是客户的字段名


如何使DataGrid标题列显示客户ID、客户名称而不是ID、客户编号?它们位于[Display]属性中,正如您可以看到的那样,DataGrid并不真正关心属性是否经过修饰。您可以禁用列的自动生成并手动定义它们,也可以利用AutoGeneratingColumn事件

<DataGrid x:Name="grid" AutoGeneratingColumn="grid_AutoGeneratingColumn"/>


private void grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        switch (e.PropertyName)
        {
            case "ID":
                e.Column.Header = "Customer ID";
                break;

            case "CusName":
                e.Column.Header = "Customer Name";
                break;

            default:
                break;
        }
    }

私有void grid_AutoGeneratingColumn(对象发送方,DataGridAutoGeneratingColumnEventArgs e)
{
开关(如PropertyName)
{
案例“ID”:
e、 Column.Header=“客户ID”;
打破
案例“CusName”:
e、 Column.Header=“客户名称”;
打破
违约:
打破
}
}
您还可以通过定义附加行为来自动化此解决方案:

public static class CustomColumnHeadersProperty
{
    public static DependencyProperty ItemTypeProperty = DependencyProperty.RegisterAttached(
        "ItemType",
        typeof(Type),
        typeof(CustomColumnHeadersProperty),
        new PropertyMetadata(OnItemTypeChanged));

    public static void SetItemType(DependencyObject obj, Type value)
    {
        obj.SetValue(ItemTypeProperty, value);
    }

    public static Type GetItemType(DependencyObject obj)
    {
        return (Type)obj.GetValue(ItemTypeProperty);
    }

    private static void OnItemTypeChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        var dataGrid = sender as DataGrid;

        if (args.NewValue != null)
            dataGrid.AutoGeneratingColumn += dataGrid_AutoGeneratingColumn;
        else
            dataGrid.AutoGeneratingColumn -= dataGrid_AutoGeneratingColumn;
    }

    static void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        var type = GetItemType(sender as DataGrid);

        var displayAttribute = type.GetProperty(e.PropertyName).GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault() as DisplayAttribute;
        if (displayAttribute != null)
            e.Column.Header = displayAttribute.Name;
    }
}


<DataGrid x:Name="grid" local:CustomColumnHeadersProperty.ItemType="{x:Type local:MyClass}"/>
公共静态类CustomColumnHeadersProperty
{
公共静态DependencyProperty ItemTypeProperty=DependencyProperty.RegisterAttached(
“项目类型”,
类型,
类型(CustomColumnHeadersProperty),
新属性元数据(OnItemTypeChanged));
公共静态void SetItemType(DependencyObject对象,类型值)
{
对象设置值(ItemTypeProperty,值);
}
公共静态类型GetItemType(DependencyObject obj)
{
返回(类型)obj.GetValue(ItemTypeProperty);
}
私有静态无效OnItemTypeChanged(DependencyObject发送方,DependencyPropertyChangedEventArgs参数)
{
var dataGrid=发送方作为dataGrid;
如果(args.NewValue!=null)
dataGrid.AutoGeneratingColumn+=dataGrid_AutoGeneratingColumn;
其他的
dataGrid.AutoGeneratingColumn-=dataGrid_AutoGeneratingColumn;
}
静态void dataGrid_AutoGeneratingColumn(对象发送方,DataGridAutoGeneratingColumnEventArgs e)
{
var type=GetItemType(发送方为DataGrid);
var displayAttribute=type.GetProperty(e.PropertyName).GetCustomAttributes(typeof(displayAttribute),false).FirstOrDefault()作为displayAttribute;
if(displayAttribute!=null)
e、 Column.Header=displayAttribute.Name;
}
}

谢谢你的帮助。我正在寻找一个自动解决方案。通过定义附加的行为,您可以使用显示或自定义定义的属性完全自动化此解决方案。您能向我解释更多详细信息吗?这是您第四次问相同的问题-1.结束发言此问题似乎与主题无关,因为OP已经反复问了4次同样的问题。如果您认为OP滥用了系统,请标记为版主。链接到“复制”吗?我找不到复制品,所以我想重新打开。这应该作为重复而不是离题关闭。请使用
DisplayName
属性。