Mehrere Einträge in einem DataGrid selektieren - wie damit umgehen?

  • WPF

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Mehrere Einträge in einem DataGrid selektieren - wie damit umgehen?

    Hallo liebes Forum,

    heute komme ich mal wieder mit einem "Problem". Na ja eher mit einer Frage nach der korrekten und sauberen Umsetzung in WPF.
    Die Frage, wie man das macht, brennt mir schon seid über einem Jahr auf dem Herzen, aber die Zeit habe ich genutzt, um die Materie weiter zu lernen.

    Ich denke der Titel erklärt das Problem schon ganz gut...

    Für das Problem hab ich ein kleines Beispiel nachgeschrieben, was es verdeutlichen soll, und wo ich (mit eurer Hilfe :) ) nach Finden der Lösung auch alles richtig implementiere - damit die Nachwelt auch noch was hat :)

    Wir haben eine Klasse, die einen Datentyp repräsentiert (in meinem Beispiel einen Song).
    Viele von diesen Songs liegen jetzt im MainViewModel in einer ObservableCollection(Of SongViewModel) und werden an ein DataGrid gebunden.
    Dort gibt es außerdem das Property SelectedSong welches - wie der Name schon sagt - an die SelectedItem Eigenschaft des DG gebunden ist.
    Links neben dem Datagrid gibt es eine Art "Bearbeiten" Feld, wo man die Eigenschaften des aktuell ausgewählten Songs bearbeiten kann.

    Wenn ich einen Song selektiere - kein Problem.
    Aber was passiert wenn ich jetzt in dem DG mehrere Songs auswähle - dann bearbeite ich immer nur den zuerst ausgewählten, weil der sich noch in der SelectedSong Eigenschaft befindet...
    Wenn ich jetzt aber für eine ganze Liste Songs das Album bearbeiten will, dann wäre das schon ein schönes Feature :)

    Man muss sich natürlich Gedanken machen, wie man so eine Bearbeitung umsetzten will.
    Ich finde folgende Lösung ganz schön:


    In dem Programm, aus dem der Screen stammt, habe ich ebenfalls 2 Songs ausgewählt, wobei einer den Albumtitel "Album 1" und der andere den Albumtitel "Album 2" beinhaltet. Ich habe jetzt sowohl die Möglichkeit, einfach den bereits gesetzten Albumnamen beizubehalten (wenn ich ihn gar nicht bearbeiten will), mich für einen zu entscheiden, oder beide zu löschen.


    Jetzt fehlt es bei mir allerdings an Ideen für die Umsetzung.
    Ich habe das Beispielprojekt mal angehängt, vielleicht hat der ein oder andere ja Lust ein wenig herumzuprobieren und mir zu helfen, folgendes Verhalten umzusetzten.

    Ich freue mich schon auf Ideen - noch einen schönen Abend
    Florian
    Dateien
    ----

    WebApps mit C#: Blazor

    florian03 schrieb:

    Aber was passiert wenn ich jetzt in dem DG mehrere Songs auswähle - dann bearbeite ich immer nur den zuerst ausgewählten, weil der sich noch in der SelectedSong Eigenschaft befindet.
    Lass dich nicht von deiner eigenen Namensgebung verwirren.
    Was bei dir SelectedSong heisst, sollte besser CurrentSong heissen - weil SelectedSongs solls ja mehrere geben.
    Ja, und dann braucht dein Song-Model wohl eine IsSelected-Property - was sonst?

    florian03 schrieb:

    Wenn ich jetzt aber für eine ganze Liste Songs das Album bearbeiten will,...
    ... und du brauchst natürlich ein Album-Model.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo @florian03

    Da gebe ich @ErfinderDesRades völlig recht, du benötigst nämlich beide Eigenschaften.

    Es gibt mehrere Arten sowas zu Lösen. Als erstes gilt es mal mehrere selektierte Datensätze erfassen zu können.
    Dafür bietet sich ein AttachedProperty an.

    VB.NET-Quellcode

    1. Imports MultiSelectExample.Instrastructure
    2. Public Class MultiSelectBehavior
    3. Public Shared ReadOnly SelectedItemsChangedHandlerProperty As DependencyProperty =
    4. DependencyProperty.RegisterAttached("SelectedItemsChangedHandler",
    5. GetType(RelayCommand), GetType(MultiSelectBehavior),
    6. New FrameworkPropertyMetadata(New PropertyChangedCallback(AddressOf OnSelectedItemsChangedHandlerChanged)))
    7. Public Shared Function GetSelectedItemsChangedHandler(ByVal element As DependencyObject) As RelayCommand
    8. If element Is Nothing Then Throw New ArgumentNullException("element")
    9. Return element.GetValue(SelectedItemsChangedHandlerProperty)
    10. End Function
    11. Public Shared Sub SetSelectedItemsChangedHandler(ByVal element As DependencyObject, ByVal value As RelayCommand)
    12. If element Is Nothing Then Throw New ArgumentNullException("element")
    13. element.SetValue(SelectedItemsChangedHandlerProperty, value)
    14. End Sub
    15. Private Shared Sub OnSelectedItemsChangedHandlerChanged(d As DependencyObject,
    16. e As DependencyPropertyChangedEventArgs)
    17. Dim dataGrid As DataGrid = DirectCast(d, DataGrid)
    18. If e.OldValue Is Nothing AndAlso e.NewValue IsNot Nothing Then
    19. AddHandler dataGrid.SelectionChanged, AddressOf ItemsControl_SelectionChanged
    20. End If
    21. If e.OldValue IsNot Nothing AndAlso e.NewValue Is Nothing Then
    22. RemoveHandler dataGrid.SelectionChanged, AddressOf ItemsControl_SelectionChanged
    23. End If
    24. End Sub
    25. Public Shared Sub ItemsControl_SelectionChanged(sender As Object,
    26. e As SelectionChangedEventArgs)
    27. Dim dataGrid As DataGrid = DirectCast(sender, DataGrid)
    28. Dim itemsChangedHandler As RelayCommand = GetSelectedItemsChangedHandler(dataGrid)
    29. itemsChangedHandler.Execute(dataGrid.SelectedItems)
    30. End Sub
    31. End Class


    Nun hast du die möglichkeit das du dieses Property an ein RelayCommand binden kannst in welchem du dann mit den Items weiterarbeiten kannst. Diese z.b. in eine zweite Auflistung zu packen.
    In Kombination mit DataTemplates und und einer "Fake" Klasse für SongViewModel (in meinem Fall MultipleSongViewModel) klappt das wunderbar.

    Anbei ein Beispiel

    Grüße
    Sascha
    Dateien
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##