这是我遇到过的最奇怪的事情。由于在Windows 8 MS中从CollectionViewSource中删除了过滤和排序,我必须构建自己的,称为CollectionView<T>
。 CollectionView
有一个类型为IObservableCollection<T>
的View属性,这是我为了保持抽象而制作的自定义界面。它的定义非常简单
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正确过滤和命令,View按预期工作。除非我将它绑定到ListView.ItemsSource属性,否则它就像没有实现INotifyCollectionChanged
一样。没有人收听CollectionChanged事件(使用调试器检查)和 UI不会更新添加新元素。但是,如果我添加一些项目然后设置ItemsSource属性,则UI会更新。就像它是一个正常的,不可观察的列表一样。
有人知道这里会发生什么吗?我已尝试删除IObservableCollection
界面,因此FilteredSortedCollection
直接实施了IReadOnlyList<T>
和INotifyCollectionChanged
,但它没有效果。
答案 0 :(得分:1)
您的收藏需要实施IList。我刚刚遇到了同样的问题,我已经实现了IList,它在我的Windows Phone应用程序中运行得很好,但是当我尝试使用Windows 8应用程序的视图模型时,它并不尊重已更改的事件。
我在我的课程中添加了IList的实现,现在一切都按预期工作了