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

时间:2018-10-16 15:37:06

标签: c# wpf wpfdatagrid

由于WPF根据保存数据的类自动创建列标题,因此我想问一下是否有可能覆盖此过程?

例如,拥有此类

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

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

正如我现在看到的那样,WPF通过获取属性的名称来创建这些列标题,并将其获取的内容粘贴“粘贴”

像这样吗?

nameof(property);

我要实现的目标是为此类属性创建自定义属性

[Header("Price in €")]
public string Value { get; set}

并让WPF基于该属性创建列标题,所以我的列将是这样-

|价格(欧元)|标题|

我的问题是如何覆盖此问题?

1 个答案:

答案 0 :(得分:2)

您可以为此创建一个简单的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"