c# - 在 WPF DataGrid 中显示 "Display name"而不是字段名称

标签 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 代码

<DataGrid Name="DataGrid" />

这就是数据绑定(bind)

    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;
    }

这是结果:

DataGrid Result

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

如何使 DataGrid 标题列显示客户 ID、客户名称而不是 ID、CusNumber?它们在 [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;
        }
    }

您还可以通过定义附加行为来自动化此解决方案:

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}"/>

关于c# - 在 WPF DataGrid 中显示 "Display name"而不是字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21164100/

相关文章:

c# - 覆盖 WCF DataMember 的字典构造函数

c# - 在 asp.net C# 中获取禁用单选按钮控件的值

c# - 通过字符串创建实例并添加到集合中

.net - 如何使 DataGridCheckBoxColumn 可编辑而不需要额外的点击?

c# - 如何在 WPF LiveCharts 中添加图表标题

c# - 下拉列表未在 UpdatePanel 中更新

c# - 以编程方式将行添加到 WPF 窗口中的网格

c# - Entity Framework 4.1 没有向 SQL Server Express 数据库添加任何行

c# - slider 的行为取决于最小-最大范围

WPF DataGrid 样式中的标题内容每个触发器仅显示一次