基本上我正在使用datagrid的ItemSource属性将通用列表绑定到我的datagrid.但是我真的想改变标题,我尝试了以下但是我得到了一个运行时异常:
dgtest.Columns[1].Header = "edited";
Run Code Online (Sandbox Code Playgroud)
Les*_*Les 16
我使用AutoGeneratingColumn事件和一个属性来设置我的列名.
首先创建一个属性类......
public class ColumnNameAttribute : System.Attribute
{
public ColumnNameAttribute(string Name) { this.Name = Name; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我用新属性装饰我的数据类成员......
public class Test
{
[ColumnName("User Name")]
public string Name { get; set; }
[ColumnName("User Id")]
public string UserID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我写了我的AutoGeneratingColumn事件处理程序......
void dgPrimaryGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var desc = e.PropertyDescriptor as PropertyDescriptor;
var att = desc.Attributes[typeof(ColumnNameAttribute)] as ColumnNameAttribute;
if(att != null)
{
e.Column.Header = att.Name;
}
}
Run Code Online (Sandbox Code Playgroud)
...并将其附加到我的网格并测试...
dgPrimaryGrid.AutoGeneratingColumn += dgPrimaryGrid_AutoGeneratingColumn;
var data = new object[]
{
new Test() { Name = "Joe", UserID = "1" }
};
dgPrimaryGrid.ItemsSource = data;
Run Code Online (Sandbox Code Playgroud)
这是它的样子.请注意,列名称不是属性名称(默认行为).

这种方法稍微有些工作,但是将列标题定义在与绑定列相同的位置是很好的.您可以重新排序列,而无需前往其他位置来修复列名称.
您可以在事件中更改它ItemDataBound:
public void yourDataGrid_OnItemDataBound(object s, DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
{
// Change the cell index to the column index you want... I just used 0
e.Item.Cells[0].Text = "Text you want in header.";
}
}
Run Code Online (Sandbox Code Playgroud)
如果网格已经绑定,你应该能够执行以下操作:
yourDataGrid.Columns[0].Header = "Text you want in header.";
Run Code Online (Sandbox Code Playgroud)
您可能会收到错误,因为您试图在绑定之前更改文本。