2016-04-22 10 views
0

IEnumarableコレクションにアイテムを追加する必要があり、アイテムがIEnumarableコレクションに追加/削除されたときにコレクション変更イベントが発生する必要があります。IEnumarableコレクションにアイテムを追加中にコレクションを通知するように変更する

Reflectionを使用するIEnumarableコレクションに新しいアイテムを追加しようとしましたが、以下のシナリオを試しましたが、IEnumarableコレクションに新しいアイテムが追加されたときにコレクションが変更されたことを通知できませんでした。

以下のいずれかを試してみると、IEnumarableコレクションが更新されません。

((IEnumerable<object>)ItemsSource).ToList().Add(NewItemsSourceAppointment); 

以下のいずれかを試して、IEnumarableコレクションは更新されましたが、コレクション変更イベントはトリガーされません。

ItemsSource = ((IEnumerable<object>)ItemsSource).Concat(new[] { NewItemsSourceAppointment }); 
+4

'IEnumerable'には' Add'メソッドがありません。このために作られた 'ObservableCollection'を使うことはできませんか? – Jonesopolis

+0

'ItemsSource'には何が格納されていますか? 'ObservableCollection 'を使用して初期化された場合は、型キャスティングを使用します。 '((ObservableCollection )ItemsSource).Add(新しいSomeType())'。 – Dennis

+0

コレクションの変更通知は、好きなものに遡って追加できる魔法ではありません。 'IEnumerable'はインターフェースであり、変更通知のような機能を追加する責任があるインターフェースの実装です。 –

答えて

0

新しく作成されたリストに要素を追加しています。 List<T>は、新しく追加された要素を他のコレクションに転送しないため、元のコレクションに要素を追加する必要があります。

オブジェクトの種類がわかっているか、そうでないかの2つの可能性があります。

この場合、IEnumerableICollection<ElementType>にキャストして、Addメソッドを使用します。

((ICollection<T>)ItemsSource).Add(NewItemsSourceAppointment) 

そうでない場合は、コレクションはまだ非ジェネリックIListインタフェースを実装していることを良いチャンスがあります。それにキャストしてAddを呼び出してください。

((IList)ItemsSource).Add(NewItemsSourceAppointment) 

ほとんどのコレクションインターフェイスでは、後者は問題ありません。

しかし、あなたのItemsSourceコレクションが読み取り専用の場合(Select呼び出しの結果など)には、上記のいずれも機能しない場合もあります。

編集:これはあなたの要素をコレクションに追加します。コレクションがコレクション変更イベントを発生させるかどうかは、コレクションの実装に依存します。

関連する問題