WPF - 更改Data Bound DataGrid上的列名

Ash*_*Ash 4 c# wpf datagrid

基本上我正在使用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)

这是它的样子.请注意,列名称不是属性名称(默认行为).

重命名列的DataGrid

这种方法稍微有些工作,但是将列标题定义在与绑定列相同的位置是很好的.您可以重新排序列,而无需前往其他位置来修复列名称.


Kel*_*sey 6

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

您可能会收到错误,因为您试图在绑定之前更改文本。