这是我遇到过的最奇怪的事情。就像在 Windows 8 MS 中删除了 CollectionViewSource 中的过滤和排序一样,我不得不自己构建一个名为CollectionView<T>
. CollectionView
有一个 View 类型的属性IObservableCollection<T>
,这是我为了保持抽象而制作的自定义接口。它的定义很简单
public interface IObservableCollection<T> : IReadOnlyList<T>, INotifyCollectionChanged
{
}
然后,我有实现此接口的内部类:
internal class FilteredSortedCollection<T> : IObservableCollection<T>
{
public event NotifyCollectionChangedEventHandler CollectionChanged;
public void RaiseCollectionChanged(NotifyCollectionChangedEventArgs args)
{
var copy = CollectionChanged;
if (copy != null)
copy(this, args);
}
public Func<IEnumerator<T>> RequestEnumerator { get; set; }
public Func<int> RequestCount { get; set; }
public Func<int, T> RequestItem { get; set; }
public IEnumerator<T> GetEnumerator()
{
return RequestEnumerator();
}
public int Count { get { return RequestCount(); } }
public T this[int index] { get { return RequestItem(index); } }
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
事情一直到这里。CollectionView 过滤器和排序正确,视图按预期工作。除非我将它绑定到 ListView.ItemsSource 属性,否则它的行为就好像它没有实现一样INotifyCollectionChanged
。没有人监听 CollectionChanged 事件(使用调试器检查)并且UI 不会随着添加的新元素而更新。但是,如果我添加一些项目,然后设置 ItemsSource 属性,则 UI 会更新。就好像它是一个正常的、不可观察的列表一样。
有人知道这里会发生什么吗?我试过删除IObservableCollection
接口,所以FilteredSortedCollection
直接实现了IReadOnlyList<T>
,INotifyCollectionChanged
但是没有用。