如何覆盖自动创建数据网格列 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"
由于 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"