2011-03-08 13 views
6

Estoy utilizando WPF DataGrid para enlazar a una colección de una clase personalizada. Usando AutoGenerateColumns = "True" en la cuadrícula XAML, la cuadrícula se crea y se rellena muy bien, pero los títulos son los nombres de las propiedades, como era de esperar.¿Por qué DataAnnotations <Mostrar (Nombre: = "Mi nombre")> se ignora cuando se utiliza un DataGrid con AutoGenerateColumns = "True"

he intentado especificando

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

del espacio de nombres System.ComponentModel.DataAnnotations y que no tiene ningún efecto. También probé

<DisplayName("My Name")> 

del espacio de nombres System.ComponentModel, pero los títulos no se ven afectados.

¿No hay forma de especificar encabezados de columna con la opción AutoGenerateColumns?

Respuesta

5

El uso de la sugerencia de @ Marc fue el comienzo de la solución, pero por sí solo, las columnas de AutoGenerated todavía tienen los nombres de las propiedades como encabezados.

Para obtener el DisplayName, es necesario agregar una rutina (en el código detrás) para controlar el evento 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 

Una solución adicional y mejor es utilizar el espacio de nombres ComponentModel.DataAnnotations y especificar ShortName :

Public Class modelQ016 
    <Display(shortname:="DB Name")> 
    Public Property DBNAME As String 
    ... 

OnGeneratingColumn se convierte en:

 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 

Tenga en cuenta que el orden de los atributos en la matriz de atributos cambia, por lo que debe usar GetType (...) en lugar de un parámetro numérico ... ¡Qué divertido!

1

Puede probar el anterior System.ComponentModel.DisplayNameAttribute. En el lenguaje de C#, [DisplayName("My Name")]. En particular, esto funciona con PropertyDescriptor, que apuntala una gran cantidad de datos vinculantes.

+0

Gracias. De hecho, traté de decir que hice lo que sugieres. Ahora arreglé la publicación para que quede más clara. – GilShalit

2

Mediante el uso posterior @GilShalit sobre, esto es lo que se necesita para agregar en caso de que esté utilizando recursos (como probablemente debería para multi idioma cultura de apoyo) en C# en este tiempo

Su Declaración propiedad con anotación manejador

[Display(ResourceType = typeof (YourStronglyTypedMessagesResource), Name = "YourGridColumnName")] 
public string Column1 { get; set; } 

Evento

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