如果我有这样的非匿名类,我知道我可以像这样使用DisplayNameAttribute
。
class Record{
[DisplayName("The Foo")]
public string Foo {get; set;}
[DisplayName("The Bar")]
public string Bar {get; set;}
}
但我有
var records = (from item in someCollection
select{
Foo = item.SomeField,
Bar = item.SomeOtherField,
}).ToList();
我将records
用于DataSource
以获取DataGrid。列标题显示为Foo
和Bar
,但必须为The Foo
和The Bar
。由于一些不同的内部原因,我不能创建一个具体的类,它必须是一个匿名类。鉴于此,无论如何我可以为这个匿名类的成员设置DisplayNameAttrubute
吗?
我试过
[DisplayName("The Foo")] Foo = item.SomeField
但它不会编译。
感谢。
答案 0 :(得分:2)
据我所知,您无法将属性应用于匿名类型。编译器根本不支持它。你可以真正离开马车并使用像Mono.Cecil这样的东西作为后置构建步骤将属性放在那里,但这几乎不是你想要考虑的事情。为什么它必须是匿名的?
答案 1 :(得分:2)
以下解决方案如何:
dataGrid.SetValue(
DataGridUtilities.ColumnHeadersProperty,
new Dictionary<string, string> {
{ "Foo", "The Foo" },
{ "Bar", "The Bar" },
});
dataGrid.ItemsSource = (from item in someCollection
select{
Foo = item.SomeField,
Bar = item.SomeOtherField,
}).ToList();
然后您有以下附加属性代码:
public static class DataGridUtilities
{
public static IDictionary<string,string> GetColumnHeaders(
DependencyObject obj)
{
return (IDictionary<string,string>)obj.GetValue(ColumnHeadersProperty);
}
public static void SetColumnHeaders(DependencyObject obj,
IDictionary<string, string> value)
{
obj.SetValue(ColumnHeadersProperty, value);
}
public static readonly DependencyProperty ColumnHeadersProperty =
DependencyProperty.RegisterAttached(
"ColumnHeaders",
typeof(IDictionary<string, string>),
typeof(DataGrid),
new UIPropertyMetadata(null, ColumnHeadersPropertyChanged));
static void ColumnHeadersPropertyChanged(DependencyObject sender,
DependencyPropertyChangedEventArgs e)
{
var dataGrid = sender as DataGrid;
if (dataGrid != null && e.NewValue != null)
{
dataGrid.AutoGeneratingColumn += AddColumnHeaders;
}
}
static void AddColumnHeaders(object sender,
DataGridAutoGeneratingColumnEventArgs e)
{
var headers = GetColumnHeaders(sender as DataGrid);
if (headers != null && headers.ContainsKey(e.PropertyName))
{
e.Column.Header = headers[e.PropertyName];
}
}
}