26

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

私の基本メソッド呼び出しは次のとおりです。

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

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

これに関する私の問題は、コレクション内のアイテムにアクセスしe.NewItemsたりe.OldItems、イベントでアクションを実行したりしたいのですが、アクションがこれらの値を渡さないことですCollectionChangedNotifyCollectionChangedAction.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;
        }
    }
}

NotifyCollectionChangedAction.Addだから私は代わりにを使うことができると思ったが、それは例外Resetをスローする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 イベントを発生させ、新しいアイテム リストまたは古いアイテム リストに渡すことができるかということです。

4

3 に答える 3

19

私はそれを調べてきましたが、どうやら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));
    }
}
于 2011-09-16T19:22:31.397 に答える
5

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

次の記事を読んでください、それは非常に興味深い読み物です:

NathanNesbitのブログ

于 2011-09-16T19:36:23.517 に答える