mayho33
Goto Top

C-Sharp WPF ListView Select nur bei bestimmter Spalte (2 Fragen in einer)

Hallo @ All,

Ich knabbere wieder mal an einem Problem mit ListViewItems und hoffe (wieder mal face-smile ) auf eure Unterstützung. Wie oben schon angedeutet möchte ich ein ListViewItem nur dann selektieren, wenn es z.B. in Spalte 2 + 3 ausgewählt wurde, nicht aber bei einem Klick in Spalte 1.

Im Detail:

Ich habe eine ListView mit mehreren Spalten (siehe Bild)
listview

Aktuell wird das ListViewItem beim Klick an jeder beliebigen Stelle selected / deselected. Das soll aber in Spalte 1 nicht passieren, weil ich dort einen Button hinterlegt habe der erst IsEnabled=true ist, wenn das Item Selected ist. Beim nochmaligen Klick wird die Zeile wieder deselected und der Button ist wieder IsEnabled=false. Eigentlich soll dann aber eine TextBox aufpoppen in der man etwas eingeben kann.

...und da wäre ich schon bei meiner 2ten Frage:

Wie kann ich es anstellen, dass beim Klick auf dem Button eine TextBox aufspringt nebst Button. Ich habe das mal gefaked in diesem Bild damit ihr versteht was ich meine:
listview - fake

Irgendeine Idee? Bin dankbar für jeden brauchbaren Ansatz.

Grüße!

Mayho

Content-ID: 335714

Url: https://administrator.de/forum/c-sharp-wpf-listview-select-nur-bei-bestimmter-spalte-2-fragen-in-einer-335714.html

Ausgedruckt am: 02.04.2025 um 05:04 Uhr

H41mSh1C0R
Lösung H41mSh1C0R 21.04.2017 um 12:34:37 Uhr
Goto Top
Hallo Mayho,

rein vom Verständnis her würd ich sagen:

Hole dir beim Clickevent den Columnindex und reagiere dann entsprechend drauf.

Column 0 --> Frame ohne Rahmen mit Textfeld + Button
Column 2+3 --> Select Zeile

VG
mayho33
mayho33 21.04.2017, aktualisiert am 24.04.2017 um 11:28:52 Uhr
Goto Top
Hi H41mSh1C0R,

Danke für den Ansatz. Rein vom Verständnis wollte ich es so lösen
Snipped:
private void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
        var gridView = listView.View as GridView;
        Point currentMouseOnGridPosition = Mouse.GetPosition(null);
       ...
       ...
        if (currentMouseOnGridPosition.X >= 0 && currentMouseOnGridPosition.X <= gridView.Columns.Width)
        {
               return;
        }
}    

Das funktioniert. Das Problem ist nun:

Ich verwende ein SelectionChanged Event. In SelectionChangedEventArgs e is e.RemovedItems bereits getriggert.

Eine Idee dazu?

EDIT

Es gibt noch ein zweites Problem:

Wähle ich ein anderes LisViewitem sind die Coordinaten der Maus plötzlich 0,0 (warum ?? )

EDIT2

Tja! Wieder mal eine einfache Lösung für das Select-Problem:

if (currentMouseOnGridPosition.X >= 0 && currentMouseOnGridPosition.X <= gridView.Columns.Width)
                {
                    e.RemovedItems.Clear();
                    return;
                    
                }

Für die Eingabe wird dann wohl einer UserControl herhalten. Das teste ich mal..
mayho33
mayho33 25.04.2017 um 17:41:37 Uhr
Goto Top
So! Bin nun wieder umgestiegen auf die ursprüngliche Ausprägung mit TextBoxen anstatt der Buttons. Konnte das Problem mit Exception bei MoseMove über der Column lösen indem ich folgendes gemacht habe:

MouseCoordinaten geholt
Column.Width + 20 (reiner Schätzwert) mit MouseCoordinaten .X vergleichen und entsprechend machen oder nicht nach folgendem Beispiel.

Funktioniert für mich. Das ist das Wichtigste.

private void listView_PreviewMouseMove(object sender, MouseEventArgs e)
{           
                Point currentMouseOnGridPosition = Mouse.GetPosition(null);
                if (currentMouseOnGridPosition.X >= ((_ListView.View as GridView).Columns.Width + 20))
                {
                    ListBoxItem draggedItem = sender as ListBoxItem;
                    DragDrop.DoDragDrop(draggedItem, draggedItem.DataContext, DragDropEffects.Move);
                }
}

Danke für deinen initialen Zünder @H41mSh1C0R !! face-smile

Grüße! Mayho