Laden...

Reordering in Listview an einer ObservableCollection feuert zweimal - Wie kann ich das vermeiden?

Erstellt von ByteDevil vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.273 Views
ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 4 Jahren
Reordering in Listview an einer ObservableCollection feuert zweimal - Wie kann ich das vermeiden?

Hallo,

ich habe ein Listview, welches via Databinding an eine von ObserableCollection abgeleitete Klasse gebunden ist. Ich möchte darauf reagieren, wenn ein Element verändert, gelöscht, hinzugefügt oder via drag and drop verschoben wird. Nun ist aber das reordering im listview wohl so implementiert, dass das Element entfernt und dann wieder eingefügt wird. Somit wird das Event "CollectionChanged" der ObservableCollection dann immer 2 mal gefreuert 😦 Kann ich das irgendwie umgehen?

Habe keine zufriedenstellende Lösung gefunden...

Vielen Dank,

ByteDevil

4.931 Beiträge seit 2008
vor 4 Jahren

Hast du dir die einzelnen NotifyCollectionChangedAction-Werte mal bei dem Event angeschaut?
Sollte beim Verschieben nicht Move gesendet werden? Oder wird dort wirklich erst Remove und danach Add gesendet?

Woher kommt denn die Drag&Drop-Implementierung?
Denn standardmäßig ist das ja nicht vorhanden, sondern muß explizit ausprogrammiert werden, wie z.B. in C# WPF listview Drag & Drop a Custom Item oder Drag and Drop Items in a WPF ListView.

ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 4 Jahren

Hi,

ja dort gibt es "Move". Allerdings tritt dieser Fall nie ein. Das reordering ist bereits im ListView Control implementiert. Dafür müssen nur die Properties "CanReorder" und "AllowDrop" auf true gesetzt werden. Erwähnenswert ist vielleicht das es sich um eine UWP-App handelt...weiß nicht ob das in dem Falle anders als bei WPF ist. ListView scheint aber nicht die "Move()" Methode der ObservableCollection zu nutzen, sondern das Element tatsächlich zu entfernen und an der neuen Stelle wieder einzufügen.

Edit: Könnte vielleicht den Eventhandler beim Start des dragings entfernen, sodass es nicht gefeuert wird und vor dem beenden wieder einfügen. Nur scheint es vom ListView kein event zu geben mit dem ich den Handler wieder anhängen kann bevor das Element wieder eingefügt wird. Aber diese Lösung scheint mir auch irgendwie ziemlich dirty...

4.931 Beiträge seit 2008
vor 4 Jahren

Das es sich um eine UWP-App handelt, hättest du mal besser gleich dazugeschrieben (selbstverständlich unterscheiden sich diese von WPF, denn ListViewBase.CanReorderItems gibt es nur bei UWP, nicht WPF).

Was ist denn dein konkretes Problem damit? Du kannst doch je nach Aktion darauf reagieren.

ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 4 Jahren

Oh entschuldige bitte, das war mir nicht klar. Wie sollte ich denn darauf reagieren? Ich kann nicht feststellen ob das Element nun nur für den Vorgang des Ordnens entfernt/hinzugefügt wurde, oder ich tatsächlich eines entfernt oder hinzugefügt habe.

4.931 Beiträge seit 2008
vor 4 Jahren

Kannst du dir beim Remove nicht das entfernte Objekt merken und bei einem (anschließenden) Add überprüfen, ob dieses wieder eingefügt wurde?

ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 4 Jahren

Zuerst wird ein Element entfernt und dann wieder hinzugefügt. Kann so nicht wissen ob das anfängliche entfernen beachtet werden soll. Checke jetzt im Eventhandler mit IsDragSource() des ListViews einfach ob es gerade beim Drag and Drop ist wenn ein Element entfernt wird. Wenn ja, mache ich einfach nichts weiter. Scheint so zu klappen, wirkt aber nicht wirklich sauber^^
Also falls noch jemandem was einfällt, dann immer raus damit 😃 Ansonsten sag ich dir schon mal danke 😃