2012-12-19 11 views
9

Beh, sono confuso.Come funziona davvero il binding alle raccolte?

Se il mio controllo ha una proprietà di dipendenza ItemsSource di IEnumerable tipo e l'utente associa la raccolta ad esso quale oggetto ho in DependencyPropertyChangedEventArgs.NewValue?

Per quanto ne so, CollectionView viene creato implicitamente per le raccolte e mi aspetto che args.NewValue sia di tipo ICollectionView.

Da this blog:

Quando un utente si lega una proprietà WPF ad una raccolta di dati, WPF crea automaticamente una vista per avvolgere la raccolta, e lega la proprietà alla vista, non il grezzo collezione. Questo comportamento si verifica sempre ed è indipendente da CollectionViewSource.

Ma debugger (VS 2012, .net v.4.0) mi mostra che ricevo collezione RAW originale in NewValue. (BindsDirectlyToSource non è impostato ed è uguale a false per impostazione predefinita)
Come può essere ?!

Non riesco a capire come in questo caso i controlli WPF supportino l'ordinamento, il raggruppamento e il filtraggio.
Come e quando viene iniettato e utilizzato CollectionView?

risposta

4

Forse il seguente estratto dalla sezione Osservazioni in CollectionView risponde alla tua domanda:

Nelle applicazioni WPF, tutte le collezioni hanno un difetto vista raccolta associata. Anziché utilizzare direttamente la raccolta, il motore di associazione accede sempre alla raccolta tramite la vista associata . Per ottenere la vista predefinita, utilizzare il metodo CollectionViewSource.GetDefaultView. Una classe interna basata su CollectionView è la visualizzazione predefinita per le raccolte che implementano solo IEnumerable. ListCollectionView è la visualizzazione predefinita per le raccolte che implementano IList. BindingListCollectionView è la vista predefinita per le raccolte che implementano IBindingListView o IBindingList.

In alternativa, è possibile creare una vista della vostra collezione in Extensible Application Markup Language (XAML) utilizzando la classe CollectionViewSource e quindi associare il vostro controllo a quel punto di vista. La classe CollectionViewSource è la rappresentazione XAML della classe CollectionView . Per un esempio, vedere Procedura: Ordinamento e raggruppamento dei dati Utilizzo di una vista in XAML.

Quindi, se non esplicitamente associa a un CollectionViewSource, una raccolta di legame è sempre fatto per la collezione originale (quello che si ottiene in NewValue), ma l'accesso alla collezione (ad esempio, ottenere un elemento da indice) è sempre eseguito attraverso la vista predefinita. Pertanto l'affermazione "lega la proprietà alla vista, non alla raccolta grezza" non è esattamente vera.

Un test rapido ha rivelato che GetDefaultView restituisce un System.Windows.Data.ListCollectionView per la mia ObservableCollection vincolata.

+0

Questo significa che il mio controllo deve richiedere CollectionView per la raccolta passata e non vi è alcun supporto per raggruppare, filtrare e ordinare fuori dalla scatola. È responsabilità del controllo implementare la funzionalità sopra citata, non è vero? –

+1

È disponibile il supporto immediato per il raggruppamento, il filtraggio e l'ordinamento quando si esegue esplicitamente il binding a una [CollectionViewSource] (http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource aspx). Vedi "Come creare una vista" in [Collegando alle raccolte] (http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections) – Clemens

+0

Bene, sembra sì. GroupItem viene creato da ItemsControl stesso ... –

Problemi correlati