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?
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
Tags und Links wpf data-binding collectionview