如何使用CollectionView功能处理CompositeCollection?

Shi*_*mmy 6 wpf observablecollection compositecollection collectionviewsource

当CompositeCollection的当前位置发生变化时,有没有办法得到通知?

我需要通过CollectionView监控CompositeCollection,任何想法都很受欢迎.

ito*_*son 6

您可以通过监视ICollectionView.CurrentChangedCollectionView 的事件来检测当前项目的更改时间.以下代码适用于我:

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"
Run Code Online (Sandbox Code Playgroud)

当我更改ListBox中的选择时,将显示消息框.

关于过滤,排序和分组,根据Aron的回答,这些在CompositeCollection的视图中不可用.但对于记录你在这里可以检测的观点,即改变方式支持以下功能:

  • 看起来当过滤器发生变化时你会得到一个CollectionChanged事件,尽管我找不到这个记录.
  • SortDescriptions是SortDescriptionCollection,它是INotifyCollectionChanged,因此在SortDescriptions属性上挂钩CollectionChanged事件处理程序.
  • GroupDescriptions是ObservableCollection<GroupDescription>,因此在GroupDescriptions属性上连接CollectionChanged事件处理程序.