Entfernen Sie ein Objekt aus einer ObservableCollection in einem CollectionChanged-Ereignishandler

7

Ich hoffe, dass ich einige Elemente ablehnen kann, nachdem sie einer ObservableCollection hinzugefügt wurden. Ich bin nicht in der Lage, die ObservableCollection abzuleiten oder irgendeine Art von Ansicht zu verwenden, daher beschränke ich mich offenbar darauf, den einen Ereignishandler (CollectionChanged) zu verwenden, um eine .Remove () für die verbotenen Elemente auszuführen. Es ist in Ordnung, wenn die Elemente für den kurzen Zeitraum zwischen dem Ereignis, das ausgelöst und dann behandelt wird, vorhanden sind. Die Gegenstände sollten nicht in der Sammlung bleiben. Das Angeben von .Remove () in dem CollectionChanged-Ereignishandler scheint nicht zulässig zu sein. Zur Laufzeit wirft .NET eine InvalidOperationException:

  

"Die ObservableCollection kann während eines CollectionChanged-Ereignisses nicht geändert werden."

Ich persönlich denke, .NET sollte es mir erlauben. Wenn ich eine Endlosschleife erzeuge, ist das mein eigener Fehler.

Der Code, den ich verwenden möchte, würde aussehen:

%Vor%

Ich bin mir nicht sicher, welche Möglichkeiten ich habe. Die Verwendung eines Dispatcher scheint nicht zu funktionieren. Das Auslösen eines anderen Ereignisses und das Platzieren des Aufrufs .Remove in einem anderen Handler ist die einzige andere Option, die in den Sinn kommt.

    
ebpa 16.03.2012, 19:32
quelle

3 Antworten

16

Sehen Sie sich Häufige Fehler bei der Verwendung einer sichtbaren Sammlung an.

Nachdem Sie gesagt haben, dass Sie diese Route immer noch verwenden möchten, können Sie ein neuer Thread

    
Anurag Ranjhan 16.03.2012, 20:08
quelle
11

Wenn Sie wirklich eine Sammlung ändern wollen, müssen Sie eine Kopie der Sammlung durchlaufen. Es ist, weil Sie versuchen, die Sammlung in der foreach-Schleife zu ändern, die Ihnen Kummer bereitet.

Beispiel

%Vor%

Das sagte, ich stimme mit Anurag überein, dass Sie diese Art von Ding nicht mit einer beobachtbaren Sammlung machen sollten und schon gar nicht in einem CollectionChanged Event.

    
tam 16.03.2012 20:24
quelle
0

Verwenden Sie ToList() , um über die Liste zu iterieren.

%Vor%     
Gilad 30.10.2017 08:38
quelle

Tags und Links