我正在使用
WPF DataGrid绑定到自定义类的集合.在网格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(…)而不是数字参数……这样的乐趣!