由于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基于该属性创建列标题,所以我的列将是这样-
|价格(欧元)|标题|
我的问题是如何覆盖此问题?
答案 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"