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开发者_JAVA技巧 are not affected.
Is there no way to specify column headings with the AutoGenerateColumns option?
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!
You might try the older System.ComponentModel.DisplayNameAttribute
. In C# parlance, [DisplayName("My Name")]
. In particular, this works with PropertyDescriptor
, which underpins a lot of data-binding.
By using @GilShalit post upon, this is what is needed to add in case that you are using Resources (as you probably should for multi culture language support) in C# in this time
Your property Declaration with Annotation
[Display(ResourceType = typeof (YourStronglyTypedMessagesResource), Name = "YourGridColumnName")]
public string Column1 { get; set; }
Event handler
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();
}
}
精彩评论