mayho33
Goto Top

C-Sharp WPF MVVM ListView mit TextBox SelectionChanged Event

Hallo @ All,

Wieder mal ein Problem mit ListView. Ich komme einfach nicht weiter und hoffe mir kann jemand etwas Starthilfe geben face-smile

Folgende Stellung:

Ich habe eine ListView mit 4 Spalten. 2 Spalten enthalten je eine TextBox die befüllt werden sollen (siehe Bild)
listview

Grundsätzlich funktioniert das SelectionChanged Event der ListView, wähle ich aber eine TextBox aus, wird ein Remove ausgeführt (SelectionChangedEventArgs e.RemovedItems) und das ListViewItem ist anschließend leer bzw. nicht mehr ausgewählt.

Habe versucht das mit Mouse-Koordinaten abzufangen...
Point currentMouseOnGridPosition = Mouse.GetPosition(null);
double col1 = (_ListView.View as GridView).Columns[2].Width + 20;
double col2 = (_ListView.View as GridView).Columns[3].Width + 20;

if (currentMouseOnGridPosition.X < /* auch > versucht usw */ (col1 + col2))
{
        // viele Viele Versuche
}

...leider absolut sinnlos, weil das Event ja schon gezündet hat.

Meine Frage dazu:

Wie kann ich verhindern, dass beim Auswählen und befüllen einer der TextBoxen das SelectionChanged Event zündet oder dies rückgängig machen?

Diese und ähnliche Beispiele die ich so im INet gefunden habe, habe ich schon versucht:
http://stackoverflow.com/questions/2608071/wpf-cancel-a-user-selection- ...
http://stackoverflow.com/questions/29993894/listview-selectionchanged-w ...

das XAML sieht folgendermaßen aus (Snipped):
<ListView
            x:Name="_ListView"  
            Grid.Row="9"  
            Grid.ColumnSpan="4"  
            x:FieldModifier="public"  
            AllowDrop="True"  
            AutomationProperties.IsColumnHeader="True"  
            ItemsSource="{Binding Path=List_All}"  
            KeyboardNavigation.TabNavigation="Continue"  
            SelectionChanged="_ListView_SelectionChanged"  
            SelectionMode="Multiple">  
            <ListView.View>
                <GridView>
                    <GridViewColumn
                        Width="80"  
                        DisplayMemberBinding="{Binding SectionName}"  
                        HeaderContainerStyle="{StaticResource GridViewHeaderAllignment}">  
                        <GridViewColumn.Header>
                            <TextBlock Text=" Section" />  
                        </GridViewColumn.Header>
                    </GridViewColumn>

                    <GridViewColumn
                        Width="auto"  
                        DisplayMemberBinding="{Binding ProgramName}"  
                        HeaderContainerStyle="{StaticResource GridViewHeaderAllignment}">  
                        <GridViewColumn.Header>
                            <TextBlock Text=" Programm-Name" />  
                        </GridViewColumn.Header>
                    </GridViewColumn>

                    <GridViewColumn Width="200" HeaderContainerStyle="{StaticResource GridViewHeaderAllignment}">  
                        <GridViewColumn.Header>
                            <TextBlock Text=" Registry-Key" />  
                        </GridViewColumn.Header>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox
                                    Width="150"  
                                    HorizontalAlignment="Center"  
                                    IsEnabled="{Binding Path=SearchedRegKey_IsEnabled}"  
                                    Text="{Binding Path=SearchedRegKey, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />  
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Width="200" HeaderContainerStyle="{StaticResource GridViewHeaderAllignment}">  
                        <GridViewColumn.Header>
                            <TextBlock Text=" Display-Name" />  
                        </GridViewColumn.Header>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox
                                    Width="150"  
                                    HorizontalAlignment="Center"  
                                    IsEnabled="{Binding Path=SearchedDisplayName_IsEnabled}"  
                                    Text="{Binding Path=SearchedDisplayName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />  
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>


Die Methode dazu:
private void _ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
            foreach (ListView_Uninstall_Model item in e.AddedItems)
            {
                item.SearchedDisplayName_IsEnabled  = true;
                item.SearchedRegKey_IsEnabled       = true;
                item.SelectedAsStart                = true;
            }

            foreach (ListView_Uninstall_Model item in e.RemovedItems)
            {
                    item.SearchedDisplayName = string.Empty;
                    item.SearchedRegKey_IsEnabled = false;
                    item.SearchedRegKey = string.Empty;
                    item.SelectedAsStart = false;
            }
}

Hoffe auf mir kann jemand helfen *liebschau*

Grüße!

Mayho

Content-Key: 336313

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

Ausgedruckt am: 28.03.2024 um 18:03 Uhr

Mitglied: H41mSh1C0R
Lösung H41mSh1C0R 28.04.2017 um 07:12:42 Uhr
Goto Top
Moin,

mal die generelle Frage warum versuchst du das alles über ein Listview umzusetzen?
Wieso kein Datagridview(DGV)? Denn was du da versuchst darzustellen schaut sehr danach aus.

Objekt was den Inhalt enthält zusammenbauen, an das DGV(die 2 Spalten editierbar einstellen) binden und fertig.

Danach arbeitest du nur noch mit dem Objekt und überlässt dem DGV alles was mit Darstellung zu tun hat.

Der Profi(Colinardo) hier im Bereich ist da fitter im C# als ich.

VG
Mitglied: mayho33
mayho33 28.04.2017 aktualisiert um 17:26:31 Uhr
Goto Top
Morgen,

hmm, hat keinen bestimmten Grund. Ich habe mehrere UI's mit gleichem Gerüst, aber unterschiedlichem Verhalten. So wie ein Install-Wizard, ist aber keiner. Du schaltest durch und gibst Daten ein bis am Ende die Installation läuft. Bei mir ist in fast jedem UI eine ListView. Wollte mir damit die Arbeit mit unterschiedlichem Code ersparen und Wiederverwendbarkeit erreichen. Rächt sich jetzt ein wenig. Gibt sowas von viel zu berücksichtigen.

Meine C#- Erfahrung hält sich sehr in Grenzen und in WPF ist das noch weniger. Ich beschäftige mich erst seit kunzem intensiv damit und habe tlw. 0 Plan face-wink

Ja Colinardo ist Super! Hat mir schon ein paarmal sehr geholfen.

DataGrid! Ich schau mir das mal an. Danke!

VG


EDIT

Holy Crab!! Ein bissl XAML => DataGrid => und schon ist es halb fertig. Ich muss mir ein Buch kaufen oder so. face-wink face-wink face-wink Ist ja viel einfacher als ListView auf den ersten Blick. Hoffentlich auch beim 2ten und 3ten.

EDIT 2

Perfekt!! Schaut zwar nicht so schön aus wie eine ListView, aber macht genau was ich will.

GROSSES DANKE!!! @H41mSh1C0R