2

这是我遇到过的最奇怪的事情。就像在 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。没有人监听 Co​​llectionChanged 事件(使用调试器检查)并且UI 不会随着添加的新元素而更新。但是,如果我添加一些项目,然后设置 ItemsSource 属性,则 UI 会更新。就好像它是一个正常的、不可观察的列表一样。

有人知道这里会发生什么吗?我试过删除IObservableCollection接口,所以FilteredSortedCollection直接实现了IReadOnlyList<T>INotifyCollectionChanged但是没有用。

4

1 回答 1

2

您的集合需要实现 IList。我刚刚遇到了同样的问题,我已经实现了 IList,它在我的 Windows Phone 应用程序中运行良好,但是当我尝试将视图模型用于 Windows 8 应用程序时,它没有遵守更改的事件。

我将 IList 的实现添加到我的班级,现在一切都按预期工作

于 2012-12-28T21:52:59.493 回答