Почему DataAnnotationsигнорируется при использовании DataGrid с AutoGenerateColumns = "True" - PullRequest
6 голосов
/ 08 марта 2011

Я использую WPF DataGrid для привязки к коллекции пользовательского класса.Используя AutoGenerateColumns = "True" в сетке XAML, сетка создается и заполняется очень хорошо, но заголовки - это имена свойств, как и следовало ожидать.

Я попытался указать

<Display(Name:="My Name")> 

из пространства имен System.ComponentModel.DataAnnotations, и это не имеет никакого эффекта.Я также пытался

<DisplayName("My Name")> 

из пространства имен System.ComponentModel, но заголовки по-прежнему не затрагиваются.

Нет ли способа указать заголовки столбцов с параметром AutoGenerateColumns?

Ответы [ 3 ]

5 голосов
/ 13 марта 2011

Использование предложения @ 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 (...) вместо числового параметра ... Такое удовольствие!

2 голосов
/ 14 июля 2016

Используя сообщение @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();
    }
}
2 голосов
/ 08 марта 2011

Вы можете попробовать более старый System.ComponentModel.DisplayNameAttribute.На языке C # [DisplayName("My Name")].В частности, это работает с PropertyDescriptor, что лежит в основе большой привязки данных.

...