2012-12-19 16 views
9

Cóż, jestem zdezorientowany.Jak działa powiązanie z kolekcjami?

Jeśli moja kontrola ma właściwość zależności ItemsSource od IEnumerable typ i użytkownik wiąże kolekcję, jaki obiekt mam w DependencyPropertyChangedEventArgs.NewValue?

O ile mi wiadomo, CollectionView jest niejawnie stworzony dla kolekcji i oczekuję, że args.NewValue będzie typu ICollectionView.

Od this blog:

Kiedy użytkownik łączy właściwości WPF do zbierania danych, WPF automatycznie tworzy widok zawinąć kolekcji i wiąże właściwość do widoku, a nie surowy kolekcja. To zachowanie zawsze ma wartość i jest niezależne od źródła CollectionViewSource.

Ale debugger (VS 2012, .net v.4.0) pokazuje mi, że otrzyma oryginalną kolekcję surowego w NewValue. (BindsDirectlyToSource nie jest ustawiony i domyślnie jest równy false)
Jak to możliwe ?!

Nie mogę zrozumieć, jak w tym przypadku kontrola WPF obsługuje sortowanie, grupowanie i filtrowanie.
W jaki sposób i kiedy CollectView jest wstrzykiwany i stosowany?

Odpowiedz

4

Może po wyciąg z sekcji Uwagi CollectionView odpowiedzi na swoje pytanie:

W aplikacji WPF, wszystkie kolekcje mają przypisaną domyślną Zobacz kolekcję. Zamiast pracować z kolekcją bezpośrednio, aparat wiążący zawsze uzyskuje dostęp do kolekcji poprzez skojarzony widok . Aby uzyskać widok domyślny, należy użyć metody CollectionViewSource.GetDefaultView. Klasa wewnętrzna oparta na CollectionView jest domyślnym widokiem dla kolekcji implementujących tylko IEnumerable. ListCollectionView jest domyślnym widokiem dla kolekcji , które implementują IList. BindingListCollectionView to domyślny widok dla kolekcji, które implementują IBindingListView lub IBindingList.

Alternatywnie, można utworzyć widok swojej kolekcji w Extensible Application Markup Language (XAML) za pomocą klasy CollectionViewSource a następnie związać swoją kontrolę do tego widoku. Klasa CollectionViewSource jest reprezentacją XAML klasy CollectionView . Na przykład zobacz: Sortowanie i grupowanie danych Korzystanie z widoku w XAML.

Więc jeśli wyraźnie nie wiążą się z CollectionViewSource, zbiór wiążący jest zawsze do oryginalnej kolekcji (co masz w NewValue), ale dostęp do kolekcji (np dostać element, indeksu) jest zawsze zrobione przez domyślny widok. Dlatego stwierdzenie "wiąże właściwość z widokiem, a nie z surową kolekcją" nie jest dokładnie prawdą.

Szybkie testy wykazały, że GetDefaultView zwraca System.Windows.Data.ListCollectionView dla mojego związanego ObservableCollection.

+0

Oznacza to, że moja kontrola MA Zażądać CollectionView dla przechodzącej kolekcji i nie ma wsparcia grupowania, filtrowania i sortowania z pudełka. Odpowiedzialność za wdrożenie wspomnianej funkcjonalności spoczywa na kontrolerach, prawda? –

+1

Dostępna jest natychmiastowa obsługa grupowania, filtrowania i sortowania po jawnym powiązaniu z [CollectionViewSource] (http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource .aspx). Zobacz "Jak utworzyć widok" w [Powiązanie z kolekcjami] (http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections) – Clemens

+0

Cóż, wygląda na to, że tak. GroupItem jest tworzony przez ItemsControl ... –

Powiązane problemy