在自定义列表上实现 INotifyCollectionChanged

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


问题是当我试图实现时INotifyCollectionChanged,似乎 UI 元素没有将处理程序附加到CollectionChanged或PropertyChanged处理程序(处理程序总是null)。但是,将列表从我的自定义列表更改为 anObservableCollection似乎工作正常。我错过了什么让 UI 将其集合绑定到我的班级?


我目前的实现看起来像


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

}

请注意,我不想像ObservableCollection许多其他答案所建议的那样继承,因为我希望这是一个查看原始列表的包装器。


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



蓝山帝景
浏览 214回答 1
1回答

慕哥6287543

为了具备ListView自动绑定到您的收藏,您必须实现这两个 INotifyCollectionChange 和 IList(注:这就是非通用的IList)。如果您修改示例代码以便您的自定义列表类实现IList:public class MyWrapperList<T> : IList<T>, INotifyPropertyChanged, INotifyCollectionChanged, IList{&nbsp; &nbsp; //... all your existing code plus: (add your own implementation)&nbsp; &nbsp; #region IList&nbsp;&nbsp; &nbsp; void ICollection.CopyTo(Array array, int index) => throw new NotImplementedException();&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; bool IList.IsFixedSize => throw new NotImplementedException();&nbsp; &nbsp; bool IList.Contains(object value) => throw new NotImplementedException();&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; int IList.IndexOf(object value) => throw new NotImplementedException();&nbsp; &nbsp; void IList.Insert(int index, object value) => throw new NotImplementedException();&nbsp; &nbsp; void IList.Remove(object value) => throw new NotImplementedException();&nbsp; &nbsp; int IList.Add(object value) => throw new NotImplementedException();&nbsp; &nbsp; public bool IsSynchronized => throw new NotImplementedException();&nbsp; &nbsp; public object SyncRoot { get; } = new object();&nbsp; &nbsp; object IList.this[int index] {&nbsp; &nbsp; &nbsp; &nbsp; get => this[index];&nbsp; &nbsp; &nbsp; &nbsp; set => this[index] = (T) value;&nbsp; &nbsp; }&nbsp; &nbsp; #endregion}然后在CollectionChanged触发按钮单击事件时设置。
打开App,查看更多内容
随时随地看视频慕课网APP