Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何覆盖自动创建数据网格列标题?_C#_Wpf_Wpfdatagrid - Fatal编程技术网

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

C# 如何覆盖自动创建数据网格列标题?,c#,wpf,wpfdatagrid,C#,Wpf,Wpfdatagrid,由于WPF根据保存数据的类自动创建列标题,我想问一下是否有可能覆盖此过程 比如说,上这个课 public class Report { public string Value { get; set; } public int Title { get; set; } } 我将收到两列-|值|标题| 正如我现在看到的,WPF通过获取属性的名称来创建这些列标题,并“粘贴”它所获取的内容的普通输出 像这样的 nameof(property); 我想要实现的目标是为属性创建一个自定义属

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

比如说,上这个课

public class Report
{
    public string Value { get; set; }
    public int Title { get; set; }
}
我将收到两列-|值|标题|

正如我现在看到的,WPF通过获取属性的名称来创建这些列标题,并“粘贴”它所获取的内容的普通输出

像这样的

nameof(property);
我想要实现的目标是为属性创建一个自定义属性,如

[Header("Price in €")]
public string Value { get; set}
让WPF基于该属性创建列标题,因此我的列如下-

|以€为首的价格|


我的问题是如何覆盖它?

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

在本例中,我将使用
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;
            }
        }      
    }
}

您可以在xaml autogeneratecolumns中设置为false,并手动创建列,自己设置标题。是的,我知道,但我想我必须以编程的方式来做我想避免的事情,因为对于类中的每一个更改,让我们假设我要添加/删除属性,我必须手动添加/删除列标题。而且在属性中设置列标题更方便更容易这里有一个在生成列时触发的事件,我认为可以使用它来做你想做的事情,我只是不记得它是哪个事件。我查一下。您是如何添加
系统.窗口.交互性的?我找不到它所属的程序集。@Magnetron,请参阅。这很难找到,但我所做的只是等待所有引用加载,然后从系统开始键入,然后键入Windows,然后键入交互性。Visual Studio很棘手
<DataGrid>
    <i:Interaction.Behaviors>
        <b:ExtendendHeadersBehavior/>
    </i:Interaction.Behaviors>
</DataGrid>
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:b="clr-namespace:YourAppNamespace"