Почему DataAnnotations <Display (Name: = "My Name")> игнорируется при использовании DataGrid с AutoGenerateColumns="True"
Я использую WPF DataGrid для привязки к коллекции пользовательских классов. При использовании AutoGenerateColumns="True" в сетке XAML сетка создается и заполняется очень хорошо, но заголовки - это имена свойств, как и следовало ожидать.
Я пытался указать
<Display(Name:="My Name")>
из пространства имен System.ComponentModel.DataAnnotations, и это не имеет никакого эффекта. Я тоже пробовал
<DisplayName("My Name")>
из пространства имен System.ComponentModel, но заголовки не затрагиваются.
Нет ли способа указать заголовки столбцов с помощью параметра AutoGenerateColumns?
3 ответа
Использование предложения @Marc было началом решения, но само по себе столбцы AutoGenerated по-прежнему имеют имена свойств в качестве заголовков.
Чтобы получить DisplayName, вам нужно добавить подпрограмму (в коде) для обработки события GridAutoGeneratingColumn:
Private Sub OnGeneratingColumn(sender As Object, e As System.Windows.Controls.DataGridAutoGeneratingColumnEventArgs) Handles Grid.AutoGeneratingColumn
Dim pd As System.ComponentModel.PropertyDescriptor = e.PropertyDescriptor
e.Column.Header = pd.DisplayName
End Sub
Дополнительным и лучшим решением является использование пространства имен ComponentModel.DataAnnotations и указание ShortName:
Public Class modelQ016
<Display(shortname:="DB Name")>
Public Property DBNAME As String
...
OnGeneratingColumn становится:
Dim pd As System.ComponentModel.PropertyDescriptor = e.PropertyDescriptor
Dim DisplayAttrib As System.ComponentModel.DataAnnotations.DisplayAttribute =
pd.Attributes(GetType(ComponentModel.DataAnnotations.DisplayAttribute))
If Not DisplayAttrib Is Nothing Then
e.Column.Header = DisplayAttrib.ShortName
End If
Обратите внимание, что порядок атрибутов в массиве атрибутов изменяется, поэтому вы должны использовать GetType(...) вместо числового параметра... Такое удовольствие!
Вы можете попробовать старше System.ComponentModel.DisplayNameAttribute
, В языке C#, [DisplayName("My Name")]
, В частности, это работает с PropertyDescriptor
, что лежит в основе многих привязки данных.
Используя сообщение @GilShalit, это то, что необходимо добавить в случае, если вы используете ресурсы (как вы, вероятно, должны для поддержки многоязычного языка) в C# в это время
Ваша недвижимость Декларация с аннотацией
[Display(ResourceType = typeof (YourStronglyTypedMessagesResource), Name = "YourGridColumnName")]
public string Column1 { get; set; }
Обработчик события
private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var pd = (PropertyDescriptor)e.PropertyDescriptor;
var atb = (DisplayAttribute)pd.Attributes[typeof(DisplayAttribute)];
if (atb != null)
{
e.Column.Header = atb.GetName();
}
}