generación de WPF DataGrid AutoColumn través ICustomTypeDescriptor
-
02-10-2019 - |
Pregunta
En un proyecto de prueba que he logrado columnas AutoGenerate WPF DataGrid en el siguiente escenario, donde los datos se almacenan en un diccionario y la unión se realiza a través de PropertyDescriptors:
public class People:List<Person>{
...
}
public class Person:Dictionary<string,string>,INotifyPropertyChanged,ICustomTypeDescriptor
{
}
El problema que estoy teniendo es en mi proyecto de la vida real que estoy usando MVVM por lo que es Personas modelo de vista que hereda ViewModelBase y por lo tanto no pueden heredar Lista
He visto un puesto similar en la unión se forma un triunfo DataGridView aquí , 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 List
Solución
El DataGrid
utiliza el CollectionView
para su colección para generar las propiedades. Más específicamente, se lanza el CollectionView
a IItemProperties
, que la CollectionView
por defecto no implementa. Si no se implementa IList
(no el genérico), entonces el CollectionView
por defecto será usado.
Por lo tanto, la implementación de la interfaz IList
no genérico debería solucionar este implementos (List<T>
tanto, que es por qué funciona si se derivan de List<Person>
).
Otros consejos
Dado que no ha mencionado ya, que tenía un problema relacionado, donde las columnas de la DataGrid
no estaban siendo cuando no había filas generada automáticamente; resulta que la DataGrid
no estaba mirando a mi implementación IItemProperties
en absoluto (no sé por qué), pero estaba usando exclusivamente la aplicación ICustomTypeDescriptor
en cada objeto fila individual para generar las columnas, que trabaja demasiado, pero los resultados en no ser sin columnas, cuando no hay filas.
La solución fue implementar ITypedList
(Salí de la aplicación IItemProperties
demasiado por si acaso) en el tipo de colección. Ahora consigo columnas generadas adecuadamente para mí en si o no hay filas.