web-dev-qa-db-fra.com

Comment puis-je déclencher un événement CollectionChanged sur une ObservableCollection et lui transmettre les éléments modifiés?

J'ai une classe qui hérite de ObservableCollection et ajoute quelques méthodes supplémentaires telles que AddRange et RemoveRange

Mon appel de méthode de base est le suivant:

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

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

Mon problème avec ceci est que je veux accéder à e.NewItems ou e.OldItems dans l'événement CollectionChanged pour effectuer une action sur n'importe quel élément de la collection, et NotifyCollectionChangedAction.Reset l'action ne passe pas dans ces valeurs

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;
        }
    }
}

J'ai donc pensé que je pouvais simplement utiliser le NotifyCollectionChangedAction.Add au lieu de Reset, mais cela lance un Range actions are not supported exception

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

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

Donc, ma question est, comment puis-je déclencher un événement CollectionChanged et lui transmettre la nouvelle ou l'ancienne liste d'éléments?

26
Rachel

Je l'ai étudié et apparemment, la méthode CollectionChanged ne peut pas être déclenchée avec plusieurs éléments.

Je peux donc appeler

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

mais je ne peux pas appeler

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

Pour l'instant, ce que j'ai fait est simplement de déclencher l'événement Add pour chaque élément ajouté, mais je suis plutôt mécontent car cela signifie que je déclenche l'événement CollectionChanged pour chaque élément de la méthode AddRange au lieu d'une seule fois.

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

Cela fonctionne bien pour moi "autonome". Ce qui signifie que je n'utilise pas de ObservableCollection pour la liaison de données. Ce n'est donc pas un problème de ObservableCollection mais plutôt une limitation de ListCollectionView.

Veuillez lire l'article suivant, c'est une lecture très intéressante:

Blog de Nathan Nesbit

5
SuperOli