Laden...

ListBox Einträge verschieben letzter Eintrag soll selektiert bleiben

Erstellt von MM72 vor einem Jahr Letzter Beitrag vor einem Jahr 689 Views
M
MM72 Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr
ListBox Einträge verschieben letzter Eintrag soll selektiert bleiben

Hallo, ich habe in einer wpf-Anwendung eine listBox erstellt, mit der Einträge nach oben und unten verschoben werden können. Funktioniert auch alles prima, bis auf 1 kleines Detail:
wenn ich einen Eintrag mehrfach nach unten verschiebe, wird er an der untersten Stelle angekommen und dann erneut auf nach unten verschieben geklickt plötzlich abgewählt und man muss erst wieder einen neuen Eintrag oder den selbigen anwählen. Im Gegensatz zum nach oben verschieben, da bleibt der Eintrag auch ausgewählt, wenn ich ganz oben angelangt bin und versuche ihn erneut nach oben zu verschieben. Es wird lediglich die Meldung ausgegeben, das der Eintrag schon ganz oben ist und er bleibt aktiv. So wie ich es wollte. Mit welchem Befehl kann ich beim nach unten Verschieben an der letzten Position dann den Eintrag ebenfalls selektiert lassen bzw. den gleichen Eintrag erneut ausgewählt haben?

hier erstmal mein soweit funktionierender Code-Auszug aus der MainWindows.xaml.cs:


        private void btnNachOben_Click(object sender, RoutedEventArgs e)
        {
            
                int index = listBox.SelectedIndex;
            if (listBox.SelectedItem == null)
            {
                statusLabel.Content = "Eintrag auswählen";
                return;
            }

            else

               if (index == 0) 
            { 
                statusLabel.Content = "Eintrag ist schon ganz oben";
            }
            else
            {
                int platzO = index;
                index--;
               Verschieben(index);
               statusLabel.Content = "Eintrag nach oben verschoben auf Platz " + platzO;
            }

        }
        private void btnNachUnten_Click(object sender, RoutedEventArgs e)
        {

            int index = listBox.SelectedIndex;

            if (listBox.SelectedItem == null)
            {
                statusLabel.Content = "Eintrag auswählen";
                return;
            }

            if (index == listBox.Items.Count - 1) 
            {
                listBox.SelectedIndex = -1;
                statusLabel.Content = "Eintrag ist schon ganz unten";
                return ;
            }
            else
                index++;
            int platzU = index + 1;
            Verschieben(index);
            statusLabel.Content = "Eintrag nach unten verschoben auf Platz " + platzU;
            //listBox.SelectedIndex = -1;      //Eintrag wieder abwhählen / deselektieren
            // wenn mehrfaches verschieben gewünscht wird, muss die obige Anweisung auskommentiert werden oder
            // in einen extra Button "Deselektieren" ausgelagert werden


        }

        private void Verschieben(int index)
        {
            Object item = listBox.SelectedItem;
            listBox.Items.Remove(item);
            listBox.Items.Insert(index, item);
            listBox.SelectedIndex = index;
        }

Ich hoffe, jemand kann mir einen Tipp dazu geben.

Danke

709 Beiträge seit 2008
vor einem Jahr

Hallo,
das Abwählen dürfte listBox.SelectedIndex = -1; bewirken.
Wenn du die Zeile weg lässt, sollte es klappen.

Abgesehen davon würde ich [Artikel] MVVM und DataBinding verwenden.
Dann könntest du durch die an die Buttons gebundenen Commands schon ausschließen, dass diese in den Fällen überhaupt klickbar sind und du arbeitest in deiner Logik mit den Daten direkt statt mit den Controls.

M
MM72 Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr

Ah Danke, da habe ich die Zeile wohl übersehen. An der anderen Stelle hatte ich es ja auskommentiert...manchmal sieht man halt das offensichtliche nicht. Den Link schau ich mir mal an, grad nur überflogen. Als C#-Sprachanfänger wird man anscheinend bei den Lehrgängen oft mit noch veralteter Vorgehensweise an bestimmte Dinge herangeführt...