2010-04-29 20 views
6

En un proyecto de prueba que he logrado columnas de DataGrid AutoGenerate WPF en el siguiente escenario, donde los datos se almacenan en un diccionario y la unión se realiza a través de PropertyDescriptors:WPF DataGrid AutoColumn través ICustomTypeDescriptor

public class People:List<Person>{ 
    ... 
} 
public class Person:Dictionary<string,string>,INotifyPropertyChanged,ICustomTypeDescriptor 
{ 

} 

Los Problema que estoy teniendo en mi proyecto de vida real Estoy usando MVVM por lo que es Personas ViewModel que hereda ViewModelBase y por lo tanto no puede heredar List <Persona>. He intentado implementar IList <Persona> en su lugar con una lista interna < Persona y establecer explícitamente el DataContext en una referencia IList <Persona> pero eso no funcionó.

que he visto en un puesto similar en la unión una victoria DataGridView forma here, por lo que me pregunto si el mismo tipo de lógica se aplica en WPF y sobre todo, lo que causa exactamente la implementación ICustomTypeDescriptor para ser recogidos al heredar Lista <T> que falta cuando simplemente implementa IList <T> en su lugar.

Respuesta

5

El DataGrid utiliza el CollectionView para su colección para generar las propiedades. Más específicamente, lanza el CollectionView al IItemProperties, que el valor predeterminado CollectionView no implementa. Si no implementa IList (NO el genérico), se usará el valor predeterminado CollectionView.

Por lo tanto, la implementación de la interfaz no genérica IList debe resolver esto (List<T> implementa ambos, por lo que funciona si deriva de List<Person>).

+0

Fantástico, que funciona con una implementación IList como sugirió, muchas gracias :) – Grokodile

1

Como no se ha mencionado anteriormente, tuve un problema relacionado con el que las columnas en el DataGrid no se generaban automáticamente cuando no había filas; resulta que el DataGrid no estaba buscando en mi implementación IItemProperties (no sé por qué), pero estaba usando puramente la implementación ICustomTypeDescriptor en cada objeto de fila individual para generar las columnas, lo que también funciona pero da como resultado que haya sin columnas cuando no hay filas.

La solución fue implementar ITypedList (también dejé la implementación IItemProperties) en el tipo de colección. Ahora obtengo columnas generadas correctamente para mí en si hay filas o no.