5

我试图从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

很明显,数据在那里。检索此数据的方法是什么?

4

2 回答 2

8

这看起来像是创建NotifyCollectionChangedEventArgs对象的任何错误。

NotifyCollectionChangedEventArgs 有几个构造函数。这里有两个相关的:

  • NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction, object)
  • NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction, IList)

第一个描述了对单个项目的更改。第二个描述了项目列表的变化。

但是,NotifyCollectionChangedEventArgs构造函数已被称为new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, enumerable). IEnumerable<...>没有实现IList,所以当第二个是应该使用的构造函数时,第一个构造函数被调用。

您是否可以控制引发的代码NotifyCollectionChanged?如果是这样,请new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, enumerable.ToList())改用。

于 2012-10-08T11:40:30.917 回答
1

很明显,数据在那里

很明显,您的已更改集合包含 type 的项目System.Linq.Enumerable.WhereSelectListIterator<MyType, IMyInterface>,而不是MyType类型。

于 2012-10-08T11:33:43.563 回答