web-dev-qa-db-ja.com

ObservableCollectionでCollectionChangedイベントを発生させ、変更されたアイテムを渡すにはどうすればよいですか?

ObservableCollectionから継承し、AddRangeRemoveRangeなどのいくつかのメソッドを追加するクラスがあります。

私の基本メソッド呼び出しはこれです:

public void AddRange(IEnumerable<T> collection)
{
    foreach (var i in collection) Items.Add(i);

    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}

これに関する私の問題は、CollectionChangedイベントのe.NewItemsまたはe.OldItemsにアクセスして、コレクション内のアイテムに対してアクションを実行し、NotifyCollectionChangedAction.Resetアクションを実行することです。これらの値を渡さない

void Instances_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.NewItems != null) // e.NewItems is always null
    {
        foreach (var item in e.NewItems)
        {
            if (item is EventInstanceModel)
                ((EventInstanceModel)item).ParentEvent = this;
        }
    }
}

したがって、Resetの代わりにNotifyCollectionChangedAction.Addを使用することもできると思いましたが、Range actions are not supported例外がスローされます

public void AddRange(IEnumerable<T> collection)
{
    var addedItems = collection.ToList();
    foreach (var i in addedItems) Items.Add(i);

    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, addedItems));
}

だから私の質問は、CollectionChangedイベントを発生させ、それに新しいまたは古い項目リストを渡すにはどうすればよいですか?

26
Rachel

私はそれを調査しており、どうやらCollectionChangedメソッドは複数のアイテムで発生させることはできません。

だから私は呼び出すことができます

OnCollectionChanged(new NotifyCollectionChangedEventArgs(
    NotifyCollectionChangedAction.Add, singleItem));

でも電話はできない

OnCollectionChanged(new NotifyCollectionChangedEventArgs(
    NotifyCollectionChangedAction.Add, listOfItems));

今のところ、追加したすべてのアイテムに対してAddイベントを発生させるだけですが、CollectionChangedメソッド内のすべてのアイテムに対してAddRangeイベントを発生させることになるので、まだ不満があります。一度だけではなく。

public void AddRange(IEnumerable<T> collection)
{
    foreach (var i in collection) 
    {
        Items.Add(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(
            NotifyCollectionChangedAction.Add, i));
    }
}
16
Rachel

これは、「スタンドアロン」でうまく機能します。データバインディングにObservableCollectionを使用していないことを意味します。したがって、これはObservableCollectionの問題ではなく、ListCollectionViewの制限です。

次の記事をお読みください。非常に興味深い記事です。

Nathan Nesbitのブログ

5
SuperOli