Вы можете определить, когда текущий элемент изменился, отслеживая событие ICollectionView.CurrentChanged
вашего CollectionView. У меня работает следующий код:
CompositeCollection cc = new CompositeCollection();
cc.Add(new CollectionContainer { Collection = new string[] { "Oh No!", "Fie" } });
cc.Add(new CollectionContainer { Collection = new string[] { "Zounds", "Ods Bodikins" } });
CollectionViewSource cvs = new CollectionViewSource { Source = cc };
// Subscribing to CurrentChanged on the ICollectionView
cvs.View.CurrentChanged += (o, e) => MessageBox.Show("current changed");
lb.ItemsSource = cvs.View; // lb is a ListBox with IsSynchronizedWithCurrentItem="True"
Когда я изменяю выбор в ListBox, появляется окно сообщения.
Что касается фильтрации, сортировки и группировки, согласно ответу Арона, они недоступны при просмотре CompositeCollection. Но для справки вот способы обнаружения изменений для представлений, которые делают поддерживают эти функции:
- Похоже, вы получите событие CollectionChanged при изменении фильтра, хотя я не могу найти это задокументировано.
- SortDescription - это SortDescriptionCollection, который является INotifyCollectionChanged, поэтому подключите обработчик событий CollectionChanged к свойству SortDescription.
- GroupDescription равен
ObservableCollection<GroupDescription>
, поэтому подключите обработчик события CollectionChanged к свойству GroupDescription.