当AutoGenerateColumns = True时,如何重命名DataGrid列?

jmu*_*mer 13 c# wpf rename autogeneratecolumn wpfdatagrid

我有一个简单的数据结构类:

public class Client {
    public String name {set; get;}
    public String claim_number {set; get;}
}
Run Code Online (Sandbox Code Playgroud)

我正在加入一个DataGrid:

this.data_grid_clients.ItemSource = this.clients;
Run Code Online (Sandbox Code Playgroud)

我想更改列标题.即:声明号码为"索赔号".我知道这可以通过执行以下操作手动创建列来完成:

this.data_grid_clients.Columns[0].Header = "Claim Number"
Run Code Online (Sandbox Code Playgroud)

但是,Columns在自动生成列时,该属性为空.有没有办法重命名列,还是我必须手动生成列?

Ekk*_*Ekk 34

您可以使用DisplayNameAttribute并更新代码的某些部分以实现您想要的效果.

您要做的第一件事是[DisplayName("")]在Client类中添加属性.

public class Client {
    [DisplayName("Column Name 1")]
    public String name {set; get;}

    [DisplayName("Clain Number")]
    public String claim_number {set; get;}
}
Run Code Online (Sandbox Code Playgroud)

更新你的xaml代码,为AutoGenerationColumn事件添加一个事件处理程序.

<dg:DataGrid AutoGenerateColumns="True" AutoGeneratingColumn="OnAutoGeneratingColumn">
</dg:DataGrid>
Run Code Online (Sandbox Code Playgroud)

最后,为代码隐藏添加一个方法.

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    var displayName = GetPropertyDisplayName(e.PropertyDescriptor);

    if (!string.IsNullOrEmpty(displayName))
    {
        e.Column.Header = displayName;
    }

}

public static string GetPropertyDisplayName(object descriptor)
{
    var pd = descriptor as PropertyDescriptor;

    if (pd != null)
    {
        // Check for DisplayName attribute and set the column header accordingly
        var displayName = pd.Attributes[typeof(DisplayNameAttribute)] as DisplayNameAttribute;

        if (displayName != null && displayName != DisplayNameAttribute.Default)
        {
            return displayName.DisplayName;
        }

    }
    else
    {
        var pi = descriptor as PropertyInfo;

        if (pi != null)
        {
            // Check for DisplayName attribute and set the column header accordingly
            Object[] attributes = pi.GetCustomAttributes(typeof(DisplayNameAttribute), true);
            for (int i = 0; i < attributes.Length; ++i)
            {
                var displayName = attributes[i] as DisplayNameAttribute;
                if (displayName != null && displayName != DisplayNameAttribute.Default)
                {
                    return displayName.DisplayName;
                }
            }
        }
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)


WoI*_*IIe 7

不错的答案

您可以在事件中修改Header自动生成的DataGridColumn标头的AutoGeneratingColumn,从中可以访问DisplayNameAttribute

Client.cs

public class Client
{
    [DisplayName("Name")]
    public String name { set; get; }

    [DisplayName("Claim Number")]
    public String claim_number { set; get; }
}
Run Code Online (Sandbox Code Playgroud)

.xaml

<DataGrid ItemSource="{Binding Clients}"
          AutoGenerateColumns="True"
          AutoGeneratingColumn="DataGrid_AutoGeneratingColumn" />
Run Code Online (Sandbox Code Playgroud)

.xaml.cs

v1

// This snippet can be used if you can be sure that every
// member will be decorated with a [DisplayNameAttribute]
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    => e.Column.Header = ((PropertyDescriptor)e.PropertyDescriptor).DisplayName;
Run Code Online (Sandbox Code Playgroud)

v2

// This snippet is much safer in terms of preventing unwanted
// Exceptions because of missing [DisplayNameAttribute].
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyDescriptor is PropertyDescriptor descriptor)
    {
        e.Column.Header = descriptor.DisplayName ?? descriptor.Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最佳答案!! (3认同)