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-Key: 335714

Url: https://administrator.de/contentid/335714

Printed on: April 25, 2024 at 00:04 o'clock

Member: H41mSh1C0R
Solution H41mSh1C0R Apr 21, 2017 at 10:34:37 (UTC)
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
Member: mayho33
mayho33 Apr 21, 2017, updated at Apr 24, 2017 at 09:28:52 (UTC)
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..
Member: mayho33
mayho33 Apr 25, 2017 at 15:41:37 (UTC)
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