Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Reordering in Listview an einer ObservableCollection feuert zweimal - Wie kann ich das vermeiden?
ByteDevil
myCSharp.de - Member

Avatar #avatar-4066.png


Dabei seit:
Beiträge: 131

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ByteDevil am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3950

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
ByteDevil
myCSharp.de - Member

Avatar #avatar-4066.png


Dabei seit:
Beiträge: 131

Themenstarter:

beantworten | zitieren | melden

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...
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von ByteDevil am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3950

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
ByteDevil
myCSharp.de - Member

Avatar #avatar-4066.png


Dabei seit:
Beiträge: 131

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3950

beantworten | zitieren | melden

Kannst du dir beim Remove nicht das entfernte Objekt merken und bei einem (anschließenden) Add überprüfen, ob dieses wieder eingefügt wurde?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
ByteDevil
myCSharp.de - Member

Avatar #avatar-4066.png


Dabei seit:
Beiträge: 131

Themenstarter:

beantworten | zitieren | melden

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 :)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ByteDevil am .
private Nachricht | Beiträge des Benutzers