2010-04-29 13 views
6

In un progetto di test sono riuscito a AutoGenerate WPF colonne DataGrid nel seguente scenario, in cui i dati vengono memorizzati in un dizionario e legatura viene eseguita tramite PropertyDescriptors:WPF DataGrid AutoColumn via ICustomTypeDescriptor

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

} 

I problema che sto avendo è nel mio progetto di vita reale Sto usando MVVM quindi è Persone ViewModel che eredita ViewModelBase e quindi non può ereditare Elenco <Persona>. Ho provato a implementare IList <Persona> invece con un Elenco interno <Persona> e impostare in modo esplicito DataContext su un riferimento IList <Persona> ma che non ha funzionato.

Ho visto un post simile sul legame una vittoria forma DataGridView here, 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 Lista <T> che manca quando si implementa semplicemente IList <T>.

risposta

5

Il DataGrid utilizza il CollectionView per la raccolta per generare le proprietà. Più nello specifico, lancia CollectionView su IItemProperties, che non viene implementato come predefinito CollectionView. Se non si implementa IList (NON quello generico), verrà utilizzato il valore predefinito CollectionView.

Quindi, l'implementazione dell'interfaccia non generica IList dovrebbe risolvere questo (List<T> implementa entrambi, motivo per cui funziona se si deriva da List<Person>).

+0

Fantastico, che funziona con un'implementazione di IList come suggerito, molte grazie :) – Grokodile

1

Poiché non è già stato menzionato, ho avuto un problema correlato in cui le colonne nello DataGrid non venivano generate automaticamente quando non c'erano righe; si scopre che il DataGrid non stava affatto guardando la mia implementazione IItemProperties (non so perché), ma stavo usando l'implementazione ICustomTypeDescriptor su ogni singolo oggetto di riga per generare le colonne, che funziona anche se risulta esserci nessuna colonna quando non ci sono righe.

La soluzione era implementare ITypedList (ho lasciato l'implementazione IItemProperties anche nel caso) sul tipo di raccolta. Ora ottengo colonne correttamente generate per me in caso o meno di righe.