我正在尝试从实现CollectionChanged
的集合的INotifyCollectionChanged
事件中获取一些自定义对象。
MyControl_MyCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if(e.Action == NotifyCollectionChangedAction.Add)
{
lock(e.NewItems.SyncRoot)
{
var myItems = e.NewItems.OfType<MyType>();
if(myItems.Any())
{
//do stuff
}
}
}
}
我面临的问题是myItems
总是说“枚举没有结果”。
扩展调试e.NewItems.SyncRoot
会显示以下内容:
e.NewItems.SyncRoot | {object[1]}
|-[0] | {System.Linq.Enumerable.WhereSelectListIterator<MyType, IMyInterface>}
| |-base ...
| |-Non-public members
| |-Results View | Expanding the Results View...
| |-[0] | MyType
很明显,数据就在那里。检索此数据的方法是什么?
答案 0 :(得分:8)
这看起来像创建NotifyCollectionChangedEventArgs
对象的任何错误。
NotifyCollectionChangedEventArgs有几个构造函数。这里有两个相关的:
NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction, object)
NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction, IList)
第一个描述了对单个项目的更改。第二个描述了项目列表的更改。
但是,NotifyCollectionChangedEventArgs
构造函数已被称为new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, enumerable)
。 IEnumerable<...>
没有实现IList
,所以当第二个构造函数应该被使用时,第一个构造函数被调用。
您是否可以控制引发NotifyCollectionChanged
的代码?如果是,请改用new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, enumerable.ToList())
。
答案 1 :(得分:1)
显然数据存在
很明显,您的收藏集已更改,其中包含System.Linq.Enumerable.WhereSelectListIterator<MyType, IMyInterface>
类型的商品,而不是MyType
类型的商品。