我目前在UWP中有一个类,该类是一堆不同类型的列表的包装,包括我构建的自定义列表。该包装程序需要绑定到某种列表,如ListView,ListBox,GridView等。
问题是,当我尝试实现INotifyCollectionChanged
时,UI元素似乎没有向CollectionChanged
或PropertyChanged
处理程序分配处理程序(处理程序始终为{ {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/
答案 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
。