Wie funktioniert die Bindung an Sammlungen wirklich?

9

Nun, ich bin verwirrt.

Wenn mein Steuerelement die Abhängigkeitseigenschaft ItemsSource von IEnumerable -Typ hat und der Benutzer die Auflistung bindet, welches Objekt habe ich in DependencyPropertyChangedEventArgs.NewValue ?

Soweit ich weiß, wird CollectionView implizit für Sammlungen erstellt und ich erwarte, dass args.NewValue vom Typ ICollectionView ist.

Aus diesem Blog :

  

Wenn ein Benutzer eine WPF-Eigenschaft an eine Sammlung von Daten bindet, WPF   erstellt automatisch eine Ansicht, um die Sammlung zu umbrechen, und bindet die   Eigenschaft für die Ansicht, nicht die rohe Auflistung . Dieses Verhalten immer   passiert und ist unabhängig von CollectionViewSource.

Aber der Debugger (VS 2012, .net v.4.0) zeigt mir, dass ich die ursprüngliche rohe Sammlung in NewValue erhalte. (BindsDirectlyToSource ist nicht festgelegt und entspricht standardmäßig falsch)

Wie kann das sein?!

Ich kann nicht verstehen, wie in diesem Fall WPF-Steuerelemente Sortierung, Gruppierung und Filterung unterstützen.
Wie und wann wird CollectionView injiziert und verwendet?

    
Pavel Voronin 19.12.2012, 09:14
quelle

1 Antwort

4

Vielleicht der folgende Auszug aus dem Abschnitt "Bemerkungen" in CollectionView beantwortet Ihre Frage:

  

In WPF-Anwendungen sind alle Sammlungen standardmäßig verknüpft   Sammlungsansicht. Anstatt mit der Sammlung direkt zu arbeiten, ist die   Die Bindungs-Engine greift immer über die zugehörige Sammlung auf die Sammlung zu   Aussicht. Um die Standardansicht zu erhalten, verwenden Sie die   CollectionViewSource.GetDefaultView-Methode. Eine interne Klasse basierend auf   CollectionView ist die Standardansicht für Sammlungen, die nur implementiert werden   IEnumerierbar. ListCollectionView ist die Standardansicht für Sammlungen   das implementieren IList. BindingListCollectionView ist die Standardansicht   für Sammlungen, die IBindingListView oder IBindingList implementieren.

     

Alternativ können Sie eine Ansicht Ihrer Sammlung in Extensible erstellen   Anwendungsauszeichnungssprache (XAML) mithilfe der CollectionViewSource   Klasse und binden Sie dann Ihr Steuerelement an diese Ansicht. Das   CollectionViewSource-Klasse ist die XAML-Darstellung des   CollectionView-Klasse Ein Beispiel finden Sie unter Gewusst wie: Sortieren und Gruppieren von Daten   Verwenden einer Ansicht in XAML.

Wenn Sie also nicht explizit an eine CollectionViewSource binden, wird immer eine Sammelbindung an die ursprüngliche Sammlung gemacht (was Sie in NewValue erhalten), aber der Zugriff auf die Sammlung (zB ein Objekt per Index) ist immer über die Standardansicht gemacht. Daher ist die Anweisung "bindet die Eigenschaft an die Ansicht, nicht die rohe Auflistung" nicht genau wahr.

Ein schneller Test ergab, dass GetDefaultView ein System.Windows.Data.ListCollectionView für meine gebundene ObservableCollection.

>     
Clemens 19.12.2012, 10:16
quelle