当使用DataGrid的AutoGenerateColumns="True"时,为什么会忽略DataAnnotations <Display(Name:="My Name")>?

7

我将使用WPF DataGrid来绑定自定义类的集合。在网格XAML中使用AutoGenerateColumns="True",可以创建和填充网格,但标题是属性名称,这是可以预期的。

我尝试指定

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

来自System.ComponentModel.DataAnnotations命名空间的,但没有任何效果。我还尝试过

<DisplayName("My Name")> 

虽然使用System.ComponentModel命名空间,但标题仍未受到影响。

有没有办法在AutoGenerateColumns选项中指定列标题?

3个回答

5

使用@Marc的建议是解决问题的开端,但仅靠这个建议,自动生成的列仍然使用属性名作为标题。

要获取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(...)而不是数字参数... 这太有趣了!

4

谢谢。我实际上尝试了你建议的方法。现在我已经修复了帖子,使其更清晰明了。 - GilShalit

3

如果您正在使用C#进行多语言支持,建议使用资源文件。根据@GilShalit的帖子,以下是需要添加的内容:

使用注释声明属性

[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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接