2010-04-29 9 views
6

W projekcie badania udało mi się AutoGenerate WPF kolumn DataGrid w następującym scenariuszu, w którym dane są przechowywane w słowniku i wiązanie odbywa się poprzez PropertyDescriptors:WPF DataGrid AutoColumn poprzez ICustomTypeDescriptor

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

} 

The Problem, który mam w moim prawdziwym projekcie życia używam MVVM, więc jest Ludzie ViewModel, który dziedziczy ViewModelBase, a tym samym nie może dziedziczyć List <Osoba>. Próbowałem już wdrożyć IList <Person> zamiast z wewnętrzną Listą <Person> i jawnie ustawiając DataContext na odniesienie do IList <Person>, ale to nie zadziałało.

Widziałem podobny post wiążące wygraną tworzy DataGridView here, więc zastanawiam się, czy ten sam rodzaj logiki zastosowanie w WPF i przede wszystkim, co dokładnie powoduje realizację ICustomTypeDescriptor być zabierani kiedy dziedziczy Lista <T> brakuje, gdy zamiast tego po prostu zaimplementujesz IList <T>.

Odpowiedz

5

Urządzenie korzysta z kolekcji CollectionView do generowania właściwości. Dokładniej, rzuca CollectionView do IItemProperties, który domyślnie CollectionView nie realizuje. Jeśli nie wdrożysz IList (NIE jest to wersja ogólna), zostanie użyty domyślny CollectionView.

W związku z tym implementacja nietypowego interfejsu IList powinna rozwiązać ten problem (List<T> implementuje oba, dlatego też działa, jeśli wywodzi się z List<Person>).

+0

Fantastyczna, która działa z implementacją IList, jak zasugerowałeś, wielkie dzięki :) – Grokodile

1

Ponieważ nie jest to już wspomniane, miałem podobny problem, gdy kolumny w DataGrid nie były generowane automatycznie, gdy nie było żadnych wierszy; okazało się, że DataGrid w ogóle nie patrzył na moją implementację IItemProperties (nie wiem dlaczego), ale używał wyłącznie implementacji ICustomTypeDescriptor dla każdego pojedynczego obiektu wiersza, aby wygenerować kolumny, co też działa, ale powoduje, że istnieje brak kolumn, gdy nie ma żadnych wierszy.

Rozwiązaniem było wdrożenie ITypedList (tak na wszelki wypadek opuściłem implementację IItemProperties) na typie kolekcji. Teraz generuję kolumny poprawnie wygenerowane dla mnie, niezależnie od tego, czy są wiersze.