Ich habe ein Listenfeld mit einer Reihe von Werten darin. Ich habe auch eine UP-Taste und eine DOWN-Taste. Mit diesen Buttons möchte ich das ausgewählte Objekt im Listenfeld nach oben / unten verschieben. Ich habe Probleme damit.
Hier ist mein Code so weit:
%Vor%Ich weiß nicht, wie ich die Werte vertauschen soll! Jede Hilfe wäre sehr geschätzt!
Da Sie das Listenfeld durch Bindung an eine ObservableCollection mit ItemsSource gefüllt haben, können Sie die Items-Eigenschaft des Listenfelds nicht ändern.
ItemsSource kann nur festgelegt werden, wenn die Items-Auflistung leer ist und Items nur geändert werden können, wenn ItemsSource null ist.
Andernfalls erhalten Sie den Fehler "Operation ist nicht gültig, während ItemsSource verwendet wird ..."
Was Sie tun müssen, ist die zugrunde liegende Sammlung zu ändern, und da es sich um eine ObservableCollection handelt, spiegelt die ListBox die Änderungen wider.
Der folgende Code zeigt, wie Sie ein Element nach oben oder nach unten verschieben können, indem Sie das Objekt in der Sammlung austauschen.
Das entsprechende XAML enthält nur eine Listbox namens lbItems und zwei Buttons, die die Eventhandler verbinden.
%Vor%Ich mache einige Erweiterungsmethoden dafür:
%Vor%Es ist nicht notwendig, die ListBox dafür zu kennen.
Dies ist der einfachste Weg dies zu tun und es werden alle richtigen Ereignisse ausgelöst, so dass Sie sich nicht um XAML kümmern müssen. ObservableCollection hat eine schöne Methode namens
%Vor%Vorausgesetzt, Sie haben eine ObservableCollection namens DataItemList
%Vor%Für Down erhalten Sie den Index des vorhergehenden Elements.
Einfach so!
Ich hätte einen Kommentar hinzugefügt, aber ich kann nicht, da ich nur 3 Reputation habe: /
Peter Hansens Lösung ist großartig, aber wenn es kein ausgewähltes Element gibt, wirft down_click eine ArgumentOutOfRange Exception. Wenn kein Element ausgewählt ist, ist der Index gleich -1.
Ich würde down_click wie folgt bearbeiten:
%Vor%Sie können so etwas versuchen:
Zum Hochziehen:
%Vor%Für die Abwärtsbewegung:
%Vor%