为什么在使用带有AutoGenerateColumns =“True”的DataGrid时,DataAnnotations <display(name:=“my name”)=“”>被忽略</display(name:=“my>

时间:2011-03-08 09:10:32

标签: .net wpf binding data-annotations wpfdatagrid

我使用WPF DataGrid绑定到自定义类的集合。使用AutoGenerateColumns =&#34; True&#34;在网格XAML中,网格被创建并填充得很好,但标题是属性名称,正如人们所期望的那样。

我尝试指定

<Display(Name:="My Name")> 
来自System.ComponentModel.DataAnnotations命名空间的

并且没有任何效果。我也试过

<DisplayName("My Name")> 

来自System.ComponentModel名称空间,但标题仍然不受影响。

是否无法使用AutoGenerateColumns选项指定列标题?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

您可以尝试较旧的System.ComponentModel.DisplayNameAttribute。在C#parlance中,[DisplayName("My Name")]。特别是,这适用于PropertyDescriptor,它支持大量数据绑定。

答案 2 :(得分:2)

通过使用@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();
    }
}