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 にはいくつかのコンストラクターがあります。ここには関連するものが 2 つあります。

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

1 つ目は、1 つのアイテムの変更について説明します。2 番目は、アイテムのリストの変更を記述します。

ただし、NotifyCollectionChangedEventArgsコンストラクターは として呼び出されていnew NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, enumerable)ます。IEnumerable<...>を実装していないIListため、最初のコンストラクターは、2 番目のコンストラクターを使用する必要があるときに呼び出されます。

発生するコードを制御できますNotifyCollectionChangedか? その場合は、new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, enumerable.ToList())代わりに使用してください。

于 2012-10-08T11:40:30.917 に答える
1

明らかにデータはそこにある

System.Linq.Enumerable.WhereSelectListIterator<MyType, IMyInterface>変更されたコレクションには、タイプではなくタイプのアイテムが含まれていることは明らかMyTypeです。

于 2012-10-08T11:33:43.563 に答える