ListView mit Checkbox und Properties, wie einzelne Reihe auswählen

  • WPF

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Runshak.

    ListView mit Checkbox und Properties, wie einzelne Reihe auswählen

    Hallo, ich habe mal wieder ein Problem...

    Ich habe mein letztes Problem soweit gelöst...nur hab ich jetzt deswegen ein neues Problem ;)

    VB.NET-Quellcode

    1. If (mList.Count > 0) Then
    2. For Each objTest As Test In mList
    3. If (objTest.IsSel = True) Then
    4. lstData.ItemContainerStyle = DirectCast(Me.Resources("stil1"), Style)
    5. Else
    6. lstData.ItemContainerStyle = DirectCast(Me.Resources("stil3"), Style)
    7. End If
    8. Next
    9. End If


    Jetzt wird sobald ich auf meinen Button klicke meine ListView gefärbt...(die Styls habe ich in XAML festgelegt)
    Hier in der Schleife prüfe ich, ob die Checkbox aktiviert wurde oder nicht (Zustand abfragen)

    über

    VB.NET-Quellcode

    1. lstData.ItemContainerStyle = DirectCast(Me.Resources("stil3"), Style)
    weise ich jetzt den Stil zu...allerdings würde ich gerne nur die dinge färben, die auch ausgewählt sind...und nciht alles...

    geht das so wie ich es gerne hätte?

    und ja ich bräuchte es so (arbeitsanweisung)
    komischer Post: Die einzige Frage, die ich erkennen kann ist, ob es so geht, und das kannst doch nur du selbst ausprobieren.

    Die Vorgehensweise ist grauenhaft und an allem vorbei, für was Wpf konzipiert wurde, aber wenns eine Arbeitsanweisung ist, dann ists halt so.

    Also ich verstehe nicht, was für eine Art Antwort du dir erhoffst.
    hm wenn es für dich aus meiner frage nicht ersichtlich ist nochmal...

    im augenblick wird, sobald die unterste Checkbox auf true gesetzt wird die komplette liste meiner ListView gefärbt...was ich allerdings nicht möchte...sondern nur das soll gefärbt werden, was auch gecheckt ist...über xaml wär das glaub recht einfach...aber ich soll es per code machen...und da ist es für mich nicht so einfach, weil ich nicht weiß wie ich es anstellen kann...ich kann aufgrund meiner implementierten checkbox leiste nicht einfach nach ischecked fragen sondern muss es über diese schleife abfragen, ob der wert true oder false ist...aber da sobald ein wert auf true ist (nämlich der letzte) wird die liste gefärbt...aber es muss doch eine möglichkeit geben das zu ändern...
    ah - also da gibts iwas mit "GetContainerFromItem" in Wpf, damit kann man das ListboxItem rausfischen, wo ein bestimmtes DatenItem drinne ist, und dann daran rumschrauben.

    Oder du programmierst wirklich das setzen des Bindings 1:1 nach.
    Also machs erstmal im Xaml, und dann googeln, wie man Bindings codeseitig festlegt.

    Genaues kann ich dir nicht erzählen, weil sowas hab ich noch nie gemacht.

    Vlt. kannst du auch mit deinen Vorgesetzten reden. Also du löst es im Xaml, zeigstes vor, und fragst, ob sie wirklich drauf bestehen, dass da statt der vorgesehenen eleganten und wartbaren Xaml-Lösung eine schlecht wartbare, kryptische Code-Lösung verbaut werden muss, die bei jedem, der bischen von wpf versteht, später nur auf totales Unverständnis stoßen wird. ?(
    also ich hab jetzt mal so viel wie möglich in xaml gemacht...und den rest als vb-code...

    XML-Quellcode

    1. <ListView Name="lstData"
    2. Margin="30"
    3. Background="White"
    4. Focusable="False"
    5. Width="Auto"
    6. MinWidth="450"
    7. ItemsSource="{Binding}"
    8. IsSynchronizedWithCurrentItem="True">
    9. <ListView.View>
    10. <GridView>
    11. <GridView.Columns>
    12. <GridViewColumn>
    13. <GridViewColumn.CellTemplate>
    14. <DataTemplate>
    15. <CheckBox Name="CheckBo" Checked="Wahr" Unchecked="Falsch" Style="{StaticResource rowStyle}" />
    16. </DataTemplate>
    17. </GridViewColumn.CellTemplate>
    18. </GridViewColumn>
    19. <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="30" />
    20. <GridViewColumn Header="Nachname" DisplayMemberBinding="{Binding Nachname}" Width="100"/>
    21. <GridViewColumn Header="Vorname" DisplayMemberBinding="{Binding Vorname}" Width="100"/>
    22. <GridViewColumn Header="Wohnort" DisplayMemberBinding="{Binding Wohnort}" Width="100" />
    23. </GridView.Columns>
    24. </GridView>
    25. </ListView.View>
    26. </ListView>


    und jetzt der vb-code

    VB.NET-Quellcode

    1. Private Sub InhaltLaden(sender As Object, e As EventArgs)
    2. lstData.Items.Add(New Prop() With {.ID = "1", .Nachname = "Müller", .Vorname = "Peter", .Wohnort = "Böblingen"})
    3. lstData.Items.Add(New Prop() With {.ID = "12", .Nachname = "Volker", .Vorname = "Gunter", .Wohnort = "Buxdehude"})
    4. lstData.Items.Add(New Prop() With {.ID = "15", .Nachname = "Meier", .Vorname = "Herbert", .Wohnort = "Sindelfingen"})
    5. lstData.Items.Add(New Prop() With {.ID = "3", .Nachname = "Mayer", .Vorname = "Franziska", .Wohnort = "Backnang"})
    6. lstData.Items.Add(New Prop() With {.ID = "6", .Nachname = "Süß", .Vorname = "Thomas", .Wohnort = "Berlin"})
    7. lstData.Items.Add(New Prop() With {.ID = "2", .Nachname = "Salzig", .Vorname = "Gerd", .Wohnort = "Paris"})
    8. lstData.Items.Add(New Prop() With {.ID = "10", .Nachname = "Bitter", .Vorname = "Lukas", .Wohnort = "New York"})
    9. lstData.Items.Add(New Prop() With {.ID = "9", .Nachname = "Most", .Vorname = "Marcel", .Wohnort = "München"})
    10. lstData.Items.Add(New Prop() With {.ID = "7", .Nachname = "Gelb", .Vorname = "Lisa", .Wohnort = "Hamburg"})
    11. lstData.Items.Add(New Prop() With {.ID = "8", .Nachname = "Weiß", .Vorname = "Maja", .Wohnort = "Tübingen"})
    12. End Sub
    13. Private Sub Wahr(sender As Object, e As EventArgs)
    14. 'MessageBox.Show("Hallo")
    15. lstData.ItemContainerStyle = DirectCast(Me.Resources("stil1"), Style)
    16. End Sub
    17. Private Sub Falsch(sender As Object, e As EventArgs)
    18. 'MessageBox.Show("Tschüss")
    19. lstData.ItemContainerStyle = DirectCast(Me.Resources("stil3"), Style)
    20. End Sub


    ich kanns jetzt auch färben ;) aber wieder nur alles oder nichts :D...ich hoffe wir finden jetzt gemeinsam eine lösung...
    mach die Checkbox erstma so:

    XML-Quellcode

    1. <CheckBox IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem, AncestorLevel=1}}"
    Das bindet die Checkbox an ListviewItem.IsSelected.

    Ich frage mich nur grad, warum du den Style auch noch wechseln willst, wo doch die Checkbox selbst bereits anzeigt, dass selected ist.
    ich wollte damit sichergehen, dass man das besser sieht und wenn man mehrere reihen als selected markiert hat, sieht man es noch besser...

    wenn ich die Checkbox so verändere, wie du es mir vorschlägst...wie muss ich dann den code verängern?

    [edit] jetzt hab ich verstanden was du meintest :) danke...trifft es ziemlich gut was ich die ganze zeit haben wollte...
    danke für deine Hilfe!