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)
您可以在事件中修改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)