generazione WPF DataGrid AutoColumn via ICustomTypeDescriptor
-
02-10-2019 - |
Domanda
In un progetto di test sono riuscito a colonne AutoGenerate WPF DataGrid nel seguente scenario, in cui i dati vengono memorizzati in un dizionario e legatura viene eseguita tramite PropertyDescriptors:
public class People:List<Person>{
...
}
public class Person:Dictionary<string,string>,INotifyPropertyChanged,ICustomTypeDescriptor
{
}
Il problema che sto avendo è nel mio progetto di vita vera che sto usando MVVM quindi è La gente ViewModel che eredita ViewModelBase e quindi non posso elencare ereditare
Ho visto un post simile sul legame si forma una vittoria DataGridView qui , quindi mi chiedo se lo stesso tipo di logica si applica a WPF e in primo luogo, ciò che provoca esattamente l'attuazione ICustomTypeDescriptor per essere prelevati quando ereditare List
Soluzione
Il DataGrid
utilizza il CollectionView
per la vostra collezione di generare le proprietà. Più in particolare, si proietta l'CollectionView
a IItemProperties
, che l'CollectionView
di default non implementa. Se non implementare IList
(non quella generica), allora la CollectionView
di default verrà utilizzato.
Quindi, implementando l'interfaccia IList
non generico dovrebbe risolvere questo (attrezzi List<T>
sia, è per questo che funziona se si deriva da List<Person>
).
Altri suggerimenti
Dal momento che non è menzionato già, ho avuto un problema correlato in cui le colonne del DataGrid
non venivano generati automaticamente quando non c'erano le righe; si scopre che il DataGrid
non stava guardando la mia implementazione IItemProperties
a tutti (non so perché), ma stava usando esclusivamente l'attuazione ICustomTypeDescriptor
su ogni oggetto singola riga per generare le colonne, che lavora troppo, ma i risultati in là dell'essere senza colonne quando non ci sono righe.
La soluzione era quella di implementare ITypedList
(ho lasciato l'attuazione IItemProperties
anche nel caso) sul tipo di raccolta. Ora ho le colonne correttamente generati per me in se o non ci sono file.