我正在使用WPF DataGrid绑定(bind)到自定义类的集合。使用XAML网格中的AutoGenerateColumns =“True”,就可以很好地创建并填充网格,但是标题就是属性名称,正如人们所期望的那样。

我尝试指定

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

从System.ComponentModel.DataAnnotations命名空间开始,则无效。我也试过了
<DisplayName("My Name")>

从System.ComponentModel命名空间开始,但标题仍然不受影响。

无法通过AutoGenerateColumns选项指定列标题吗?

最佳答案

使用@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(...)而不是数字参数...太有趣了!

关于.net - 为什么DataAnnotations <Display(Name : =“My Name” )> ignored when using a DataGrid with AutoGenerateColumns =“True” ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5230402/

10-13 06:49