在自定义列表上实现INotifyCollectionChanged

时间:2018-07-23 22:39:47

标签: c# xaml binding uwp

我目前在UWP中有一个类,该类是一堆不同类型的列表的包装,包括我构建的自定义列表。该包装程序需要绑定到某种列表,如ListView,ListBox,GridView等。

问题是,当我尝试实现INotifyCollectionChanged时,UI元素似乎没有向CollectionChangedPropertyChanged处理程序分配处理程序(处理程序始终为{ {1}})。但是,将列表从我的自定义列表更改为null似乎很好。我缺少使UI绑定其集合更改为类的什么功能?

我当前的实现看起来像

ObservableCollection

请注意,由于我希望这是查看原始列表的包装,因此我不希望像其他许多答案一样从public class MyWrapperList<T> : IList<T>, INotifyPropertyChanged, INotifyCollectionChanged { private IEnumerable<T> _source; // Implement all interfaces here, including my custom GetEnumerator() and all my add, insert, remove, etc classes } 进行插入。

编辑:您可以在GitHub上找到可复制的问题示例:https://github.com/nolanblew/SampleCollectionChanged/

1 个答案:

答案 0 :(得分:1)

要使ListView自动绑定到您的收藏集,您必须同时实现 INotifyCollectionChange IList(注意:这是非泛型 IList)。

如果您修改示例代码,以便您的自定义列表类实现IList

public class MyWrapperList<T> : IList<T>, INotifyPropertyChanged, INotifyCollectionChanged, IList
{

    //... all your existing code plus: (add your own implementation)

    #region IList 

    void ICollection.CopyTo(Array array, int index) => throw new NotImplementedException();        
    bool IList.IsFixedSize => throw new NotImplementedException();
    bool IList.Contains(object value) => throw new NotImplementedException();       
    int IList.IndexOf(object value) => throw new NotImplementedException();
    void IList.Insert(int index, object value) => throw new NotImplementedException();
    void IList.Remove(object value) => throw new NotImplementedException();
    int IList.Add(object value) => throw new NotImplementedException();
    public bool IsSynchronized => throw new NotImplementedException();
    public object SyncRoot { get; } = new object();

    object IList.this[int index] {
        get => this[index];
        set => this[index] = (T) value;
    }
    #endregion
}

然后在触发按钮单击事件时设置CollectionChanged