3

我正在编写自己的集合类,它也实现了 INotifyCollectionChanged。我在 Windows 8 商店应用程序 (winRT) 中使用它。我编写了一个单元测试,证明修改列表的内容会引发所有正确的事件,这些事件与“正常”可观察集合会引发的事件相同。尽管如此,当我将 ItemsControl 的 ItemsSource 属性(我尝试过 GridView、ListView 甚至普通的 ItemsControl)绑定到集合时,更改集合时它不会影响 UI。

底层集合类型是否必须是 ObservableCollection 才能工作,还是可以编写我自己的集合类?

谢谢

4

1 回答 1

0

您也可以使用ICollectionView具有一些扩展功能的过滤器。如果您想要预制课程,请查看Code Project 中提供的课程

特别是,我注意到 UI 订阅了该VectorChanged事件,因此您应该只执行IObservableCollection评论中前面提到的实现。

VectorChanged事件采用 type 的接口IVectorChangedEventArgs,我环顾四周时没有发现具体的类。不过创建一个并不难。这是一个可以类似于创建NotifyPropertyChangedEventArgs. 它是私有的,因为它只在集合类中使用。

private sealed class VectorChangedEventArgs : IVectorChangedEventArgs
{
    public VectorChangedEventArgs(NotifyCollectionChangedAction action, object item, int index)
    {
        switch (action)
        {
            case NotifyCollectionChangedAction.Add:
            CollectionChange = CollectionChange.ItemInserted;
            break;
            case NotifyCollectionChangedAction.Remove:
            CollectionChange = CollectionChange.ItemRemoved;
            break;
            case NotifyCollectionChangedAction.Move:
            case NotifyCollectionChangedAction.Replace:
            CollectionChange = CollectionChange.ItemChanged;
            break;
            case NotifyCollectionChangedAction.Reset:
            CollectionChange = CollectionChange.Reset;
            break;
            default:
            throw new ArgumentOutOfRangeException("action");
        }
        Index = (uint)index;
        Item = item;
    }

    /// <summary>
    /// Gets the affected item.
    /// </summary>
    public object Item { get; private set; }

    /// <summary>
    /// Gets the type of change that occurred in the vector.
    /// </summary>
    public CollectionChange CollectionChange { get; private set; }

    /// <summary>
    /// Gets the position where the change occurred in the vector.
    /// </summary>
    public uint Index { get; private set; }
}
于 2013-05-06T15:13:25.077 回答