Supprimer un élément à partir d'une ObservableCollection dans un gestionnaire d'événement CollectionChanged

J'espère être en mesure d'en rejeter certains éléments après qu'ils ont été ajoutés à une ObservableCollection. Je ne suis pas capable de la sous-classe de l'ObservableCollection ou d'utiliser toute sorte de vue, donc je semble être limité à l'utilisation d'un gestionnaire d'événement défini (CollectionChanged) pour effectuer une .Remove() sur les objets interdits. C'est bien si les produits existent pour la courte période entre l'événement déclenché, puis traitées; les articles doivent juste de ne pas persister dans la collection. De l'appelant .Remove() dans le gestionnaire d'événement CollectionChanged ne semble pas être autorisé. Au moment de l'exécution .NET lance une exception InvalidOperationException:

"Ne peut pas changer ObservableCollection lors d'un événement CollectionChanged."

Personnellement, je pense .NET devrait me permettre de. Si je crée une boucle infinie, c'est mon propre sacrément faute.

Le code je voudrais utiliser ressemblerait à:

myCollection.CollectionChanged += (sender, args) =>
{
    if (args.Action == NotifyCollectionChangedAction.Remove)
        return;
    foreach (var itm in myCollection)
    {
        if (itm.name == "Fred")
            myCollection.Remove(itm);
    }
}

Je ne suis pas sûr de ce que les options que j'ai. À l'aide d'un répartiteur ne semble pas fonctionner. Le déclenchement d'un autre événement, et en plaçant les .Supprimer appeler dans un autre gestionnaire est la seule autre option qui vient à l'esprit.

Vous ne pouvez pas supprimer des éléments à partir d'une ObservableCollection. C'est le point entier de l'un... Vous ne sera en mesure de supprimer des éléments de la collection qu'elle enveloppe.
Vous ne devriez pas le faire dans la collection a changé de gestionnaire d'événements. Au lieu de faire le filtre avant d'autoriser la perception d'être changé. Ne pas autoriser la perception d'être changé si ce n'est pas une modification appropriée.
Je sais que c'est vieux et n'est probablement pas la "bonne" façon de le faire; mais c'est ce que j'ai fait et peut aider quelqu'un. J'ai eu le même problème de l'obtention de cette exception, quand j'ai essayé de supprimer les fichiers sélectionnés à partir d'un OberservableCollection. L'événement CollectionChange tirait encore, lors de la deuxième fichier de demande de suppression a été traité par mon Messager. Donc, dans mon gestionnaire d'événement CollectionChanged, j'ai dû ajouter lock (this.Files) { // Code of the Event } une Fois que je l'ai fait, j'ai couru mon programme et sélectionné multi fichiers et appuyez sur la touche supprimer. Cette fois-ci ne fait pas exception, puisque la Supprimer en attente.

OriginalL'auteur ebpa | 2012-03-16