如何覆盖自动创建数据网格列 header?

How to override automate creation of data grid column header?

由于 WPF 根据 class 保存数据自动创建列 headers,我想问一下是否有可能重写这个过程?

例如,有这个class

public class Report
{
    public string Value { get; set; }
    public int Title { get; set; }
}

我将收到 2 列 - |价值 |标题 |

正如我现在看到的那样,WPF 通过获取 属性 的名称和 "pastes" 它所获取内容的纯输出来创建这些列 headers

是这样的吗?

nameof(property);

我想要实现的目标是为 属性 喜欢的

创建一个自定义属性
[Header("Price in €")]
public string Value { get; set}

并让 WPF 基于该属性创建列 header,因此我的列将是这样的 -

|价格 € |标题 |

我的问题是如何覆盖它?

您可以为此创建一个简单的 Behavior

我将在此示例中使用 ComponentModel.DescriptionAttribute,但您当然可以使用任何自定义属性。

using System.ComponentModel;
using System.Windows.Interactivity;

class ExtendendHeadersBehavior : Behavior<DataGrid>
{
    protected override void OnAttached()
    {
        AssociatedObject.AutoGeneratingColumn += AssociatedObject_AutoGeneratingColumn;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.AutoGeneratingColumn -= AssociatedObject_AutoGeneratingColumn;
    }

    private void AssociatedObject_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.PropertyDescriptor is PropertyDescriptor desc)
        {
            string header = desc.Attributes.OfType<DescriptionAttribute>()
                .FirstOrDefault()?.Description;

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

用法:

<DataGrid>
    <i:Interaction.Behaviors>
        <b:ExtendendHeadersBehavior/>
    </i:Interaction.Behaviors>
</DataGrid>

命名空间是:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:b="clr-namespace:YourAppNamespace"