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

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

public class Client { public String name {set; get;} public String claim_number {set; get;} } 

我正在加入DataGrid

 this.data_grid_clients.ItemSource = this.clients; 

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

 this.data_grid_clients.Columns[0].Header = "Claim Number" 

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

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

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

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

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

   

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

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

很好的答案

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

Client.cs

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

的.xaml

  

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

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

您可以使用AutoGeneratingColumns事件。

 private void dataGridAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { if (e.PropertyName.StartsWith("MyColumn") e.Column.Header = "Anything I Want"; } 

我将Ekk的答案重构为更短且与Resharper兼容的解决方案:

 public static string GetPropertyDisplayName(object descriptor) { var propertyDescriptor = descriptor as PropertyDescriptor; if (propertyDescriptor != null) { var displayName = propertyDescriptor.Attributes[typeof(DisplayNameAttribute)] as DisplayNameAttribute; if (displayName != null && !Equals(displayName, DisplayNameAttribute.Default)) { return displayName.DisplayName; } } else { var propertyInfo = descriptor as PropertyInfo; if (propertyInfo != null) { var attributes = propertyInfo.GetCustomAttributes(typeof(DisplayNameAttribute), true); foreach (object attribute in attributes) { var displayName = attribute as DisplayNameAttribute; if (displayName != null && !Equals(displayName, DisplayNameAttribute.Default)) { return displayName.DisplayName; } } } } return null; } 

简短的回答

您可以在AutoGeneratingColumn事件中修改自动生成的DataGridColumn标头的标头。

的.xaml

  

.xaml.cs

 private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { switch (e.Name) { case nameof(Client.name): e.Column.Header = "Name"; break; case nameof(Client.claim_number): e.Column.Header = "Claim Number"; break; } }