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
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.
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...
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.
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.
Kannst du dir beim Remove
nicht das entfernte Objekt merken und bei einem (anschließenden) Add
überprüfen, ob dieses wieder eingefügt wurde?
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 😃