Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is DataAnnotations <Display(Name:="My Name")> ignored when using a DataGrid with AutoGenerateColumns="True"

I'm using the WPF DataGrid to bind to a collection of a custom class. Using AutoGenerateColumns="True" in the grid XAML, the grid is created and populated just fine, but the headings are the property names, as one would expect.

I tried specifying

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

from the System.ComponentModel.DataAnnotations namespace and that has no effect. I also tried

<DisplayName("My Name")> 

from the System.ComponentModel name space but still the headings are not affected.

Is there no way to specify column headings with the AutoGenerateColumns option?

like image 638
GilShalit Avatar asked Mar 08 '11 09:03

GilShalit


1 Answers

Using @Marc's suggestion was the beginning of the solution, but taken on it's own, the AutoGenerated columns still have the property names as headings.

To get the DisplayName, you need to add a routine (in the code behind) to handle the GridAutoGeneratingColumn event:

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

An additional and better solution is to use the ComponentModel.DataAnnotations namespace and specify ShortName:

Public Class modelQ016
    <Display(shortname:="DB Name")>
    Public Property DBNAME As String
    ...

OnGeneratingColumn becomes:

        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

Note that the order of attributes in the attribute array changes, so you must use the GetType(...) instead of a numeric parameter... Such fun!

like image 51
GilShalit Avatar answered Sep 25 '22 14:09

GilShalit