Binden einer Combobox mit Checkboxen gefüllt an eine Klasse

  • WPF

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

    Binden einer Combobox mit Checkboxen gefüllt an eine Klasse

    Servus middenand,

    ich habe eine Combobox die mit Checkboxen befüllt ist. Jede Checkbox hat den Namen eines Musikgenre. Nun soll man diese Musikgenres anklicken können, damit mein Programm weiss: Aha, Musiktitel dieses Genre sollen in Listboxen angezeigt werden. Standardmäßig sind alle angekreuzt.

    Gebunden ist diese Combobox momentan per ItemsSource an eine Klasse Genres im Model.

    Das Ganze sieht so aus und ist Teil eines UserControls auf meinem MainWindow:

    XML-Quellcode

    1. <ComboBox Name="cmbGenre" IsEditable="False" ItemsSource="{Binding AnzuzeigendeGenres}">
    2. <ComboBox.ItemTemplate>
    3. <DataTemplate>
    4. <CheckBox Content="{Binding Genre, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsChecked="{Binding IstSelektiert, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
    5. </DataTemplate>
    6. </ComboBox.ItemTemplate>
    7. </ComboBox>


    Die Klasse an sich:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.ComponentModel
    3. Public Class Genres
    4. Public _IstSelektiert As Boolean
    5. Public _Genre As String
    6. Public Property IstSelektiert As Boolean
    7. Get
    8. Return _IstSelektiert
    9. End Get
    10. Set(value As Boolean)
    11. _IstSelektiert = value
    12. End Set
    13. End Property
    14. Public Property Genre As String
    15. Get
    16. Return _Genre
    17. End Get
    18. Set(value As String)
    19. _Genre = value
    20. End Set
    21. End Property
    22. Public Sub New(varIstSelektiert As Boolean, varGenre As String)
    23. _IstSelektiert = varIstSelektiert
    24. _Genre = varGenre
    25. End Sub
    26. End Class


    Im ViewModel hab ich folgendes stehen:

    VB.NET-Quellcode

    1. Public ReadOnly Property AnzuzeigendeGenres As ObservableCollection(Of Genres)
    2. Get
    3. Dim retlist = New List(Of Genres)
    4. For Each item In InhaltGesamt 'InhaltGesasmt ist eine ObservableCollection(Of <MP3Metadaten>)
    5. retlist.Add(New Genres(True, item.Genre))
    6. Next
    7. Return New ObservableCollection(Of Genres)(retlist.OrderBy(Function(o) o.Genre).GroupBy(Function(f) f.Genre).Select(Function(g) g.First()).ToList()) 'doppelte Einträge entfernen und alphabetisch sortieren
    8. End Get
    9. End Property


    und Folgendes soll in einer Listbox mit Radiostreams (welche intern auch als MP3 mit Metadaten gehandlet werden) nur diejenigen Radiostreams anzeigen, die zu den ausgewählten Genres gehören:

    VB.NET-Quellcode

    1. Public ReadOnly Property AnzuzeigendeRadiostreams As ObservableCollection(Of MP3FileInfo)
    2. Get
    3. Dim retList = New List(Of MP3FileInfo)
    4. For Each item In InhaltGesamt
    5. If item.Stream = True Then 'aussortieren, ob es sich um einen Radiostream handelt
    6. retList.Add(item)
    7. End If
    8. Next
    9. Dim filteredList As List(Of MP3FileInfo) = retList
    10. If Not String.IsNullOrEmpty(TextFilter) Then
    11. filteredList = retList.Where(Function(x) x.Interpret.ToLower.Contains(TextFilter)).ToList() 'Textfilter ist an eine Textbox gebunden, wenn man jetzt z.B. den Sendernamen eingibt (welcher in [tt].Interpret[/tt] hinterlegt ist) sollen die dem Namen entsprechenden Sender angezeigt werden --> funktioniert soweit...
    12. Dim AusgewählteGenres As New List(Of String) 'ab hier kann man das glaube ich besser machen mit Linq
    13. For Each item In AnzuzeigendeGenres
    14. If item.IstSelektiert = True Then
    15. AusgewählteGenres.Add(item.Genre)
    16. End If
    17. Next
    18. Dim Ablage As New List(Of MP3FileInfo)
    19. For i = 0 To filteredList.Count - 1
    20. If AusgewählteGenres.Contains(filteredList(i).Genre) Then
    21. Ablage.Add(filteredList(i))
    22. End If
    23. Next
    24. filteredList = Ablage 'bis hier
    25. End If
    26. Return New ObservableCollection(Of MP3FileInfo)(filteredList.OrderBy(Function(o) o.Interpret).GroupBy(Function(f) f.Interpret).Select(Function(g) g.First()).ToList())
    27. End Get
    28. End Property


    Wenn ich aber nun ein Genre "weggklicke" passiert rein gar nichts...

    Wenn noch weitere Rückfragen sind, bitte melden, oder auch wenn das ganze Projekt benötigt wird...

    Bini gespannt auf Eure Antworten :) :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kafffee“ ()

    Hallo

    So ganz geht der Code nicht auf, es ist auch nicht so toll das du immer Liste hin und her befüllst anstatt einfach die View zu filtern.
    Stelle mal ein Projekt Online (welches lauffähig ist ohne das man noch Dateien benötigt welche nicht dabei sind) und dann mal sehen was du da alles so gebastelt hast.

    Grüße
    Sascha
    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. ##

    Nofear23m schrieb:

    welches lauffähig ist ohne das man noch Dateien benötigt welche nicht dabei sind

    Hardcoded Pfade sind immer eine recht schlechte Idee. Projekt sohin NUR bei dir lauffähig. Binde solche Files in dein Projekt ein mit Erstellungsart "Inhalt" und stelle die Option "In Ausgabeverzeichnis kopieren" auf "Wenn neuer" oder so ähnlich.



    Grüße
    Sascha
    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. ##

    Oh sorry das hatte ich gar nicht mehr auf dem Schirm. Das hatte ich am Anfang schon nicht geschafft einzubinden und jetzt immer noch net. Also einzubinden schon aber wenn ich dann

    ...ImageSource="\Images\Hintergrundbild mache, kommt der Fehler "...ist keine Textdatei" oder so. Weil er wahrscheinlich einen Pfad erwartet dann....

    Habs jetzt einfach mal weggelassen aber da könnte ich echt auch ein bisschen Hilfe gebrauchen. In den MS Docs steht was von Uri aber das hab ich nicht so recht verstanden...

    Und hier das Projekt nochmal:

    Edit: Projekt entfernt da nicht bereinigt. Ich arbeite daran es zu bereinigen...

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

    kafffee schrieb:

    Habs jetzt einfach mal weggelassen aber da könnte ich echt auch ein bisschen Hilfe gebrauchen.

    OK, dafür am besten dann aber wieder in nem eigenem Tread damit die Nachwelt auch was findet.

    Ich schau mir das aktuelle Problem erstmal an.

    Grüße
    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. ##

    Da ist ja immer noch der Architektur-Fehler drin, dass die Property im Getter aufwändigen Durchsuche-Code ausführt.
    Eine Suche soll nur dann durchgeführt werden, wenn die Kriterien sich ändern.
    Nicht immer wieder neu bei jedem Abruf des Ergebnisses.

    Da brauch man den Code nicht verbessern, wenn schon die Architektur nicht stimmt.



    Ansonsten bekomme ich beim Start dieses zu sehen:

    kafffee schrieb:

    Wenn ich aber nun ein Genre "weggklicke" passiert rein gar nichts...
    Ähm - wie stelle ich es nun an, ein Genre wegzuklicken?

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

    @ErfinderDesRades

    Unterhalb der Listbox in der Spalte Alben ist ne Combobox. Die öffnen dann kannst du deselektieren...

    Wann wird deiner Meinung nach neu abgerufen? Ich muss dazu sagen sass sich die ObersvableCollection InhaltGesamt nur einmal während der Laufzeit ändern wird: Beim Start des Programms (oder wenn der User das explizit veranlasst...)

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

    Hallo

    Wie schon von EDR erwähnt ist das keine so tolle Idee. Im Grunde wenn ich das so richtig sehe hast du ja nur zwei Listen. MP3 Titel und Streams.
    Ja, du hast mehrere Listboxen, aber die ersten drei zeigen ja immer das selbe an Daten an. Unterschiedliche Eigenschaften, aber immer die selben Daten.
    Nur die letzte Listbox zeigt Streams an.

    Gut. Also brauchst du mal nur zwei Listen im ViewModel, der rest wird über Binding gelöst. Also was genau angezeigt wird.
    OK. Und da die WPF sowas wie CollectionViews bereitstellt (Ich merke schon, trotz alle dem ich es immer wieder schreibe hast du dir meine Tutorialreihe nicht zu gemüte geführt, denn dort behandle ich CollectionViews in einem eigenem Kapitel) können wir damit nun auch Filtern und Sortieren. Und zwar easy und so das der Code übersichtlich bleibt.

    Ich finde hald folgendes weit besser zu lesen und muss nicht mit x Listen spielen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SucheViewModel
    2. Inherits Infrastructure.ViewModelBase
    3. Public Sub New()
    4. InhaltGesamt = New ObservableCollection(Of MP3FileInfo)
    5. InhaltGesamt.Add(New MP3FileInfo("C:\Test1.mp3", "01", "DMX", "Great Depression", "Trina Moe", "03:49", "2003", False, "Hiphop"))
    6. InhaltGesamt.Add(New MP3FileInfo("C:\Test2.mp3", "01", "Eminem", "Marshal Mathers LP", "Stan", "02:30", "2000", False, "Hip-Hop"))
    7. InhaltGesamt.Add(New MP3FileInfo("www.swr3.de/stream", "01", "SWR3", "SWR3", "SWR3", "00:00", DateTime.Now.Year, True, "Rock/Pop"))
    8. InhaltGesamt.Add(New MP3FileInfo("www.dasding.de/stream", "01", "DasDing", "DasDing", "DasDing", "00:00", DateTime.Now.Year, True, "Dance"))
    9. GenerateGenreList()
    10. _mp3FilesView = CollectionViewSource.GetDefaultView(InhaltGesamt.ToArray()) 'View für Musiktitel erstellen (Ob Album oder Interpret angezeigt wird entscheided View durch Binding)
    11. _streamsView = CollectionViewSource.GetDefaultView(InhaltGesamt.ToArray()) 'View für Streams erstellen
    12. 'Beide Views erhalten erstmal die selbe Datengrundlage, was angezeigt wird entscheidet anschliessend rein der Filter!!
    13. _mp3FilesView.Filter = AddressOf Mp3FilesView_Filter 'Filtermethode angeben
    14. _streamsView.Filter = AddressOf StreamsView_Filter 'Filtermethode angeben
    15. 'Sortierungen setzen, dies könnte dann auch über Binding geregelt werden, da könnte es sich der User aussuchen
    16. _mp3FilesView.SortDescriptions.Add(New SortDescription(NameOf(MP3FileInfo.Musiktitel), ListSortDirection.Ascending))
    17. _streamsView.SortDescriptions.Add(New SortDescription(NameOf(MP3FileInfo.Interpret), ListSortDirection.Ascending))
    18. End Sub
    19. Private _TextFilter As String = ""
    20. Public Property TextFilter() As String
    21. Get
    22. Return _TextFilter
    23. End Get
    24. Set(ByVal value As String)
    25. _TextFilter = value : RaisePropertyChanged() : RefreshViews()
    26. End Set
    27. End Property
    28. Private Property InhaltGesamt() As ObservableCollection(Of MP3FileInfo) 'Property ist Private und muss garnicht nach aussen gereicht werden da von der View nicht benötigt
    29. Private _mp3FilesView As ICollectionView 'View für Musiktitel
    30. Public ReadOnly Property Mp3FilesView As ICollectionView
    31. Get
    32. Return _mp3FilesView
    33. End Get
    34. End Property
    35. Private _streamsView As ICollectionView 'View für Streams
    36. Public ReadOnly Property StreamsView As ICollectionView
    37. Get
    38. Return _streamsView
    39. End Get
    40. End Property
    41. Private Function StreamsView_Filter(obj As Object) As Boolean 'Die Methode filtert alle Musiktitel und alles was weder = dem TextFilter ist noch ein abgewähltes Genre ist
    42. Dim mp3Object = DirectCast(obj, MP3FileInfo)
    43. Dim allowed = mp3Object.Stream
    44. If Not String.IsNullOrEmpty(TextFilter) Then
    45. allowed = mp3Object.Interpret.ToLower().Contains(TextFilter.ToLower())
    46. If Not allowed Then Return allowed
    47. End If
    48. For Each selGenre In AnzuzeigendeGenres.Where(Function(g) Not g.IsSelected)
    49. If mp3Object.Genre = selGenre.Genre Then Return False
    50. Next
    51. Return allowed
    52. End Function
    53. Private Function Mp3FilesView_Filter(obj As Object) As Boolean 'Die Methode filtert alle Streams und alles was weder = dem TextFilter ist noch ein abgewähltes Genre ist
    54. Dim mp3Object = DirectCast(obj, MP3FileInfo)
    55. Dim allowed = Not mp3Object.Stream
    56. If Not allowed Then Return allowed
    57. If Not String.IsNullOrEmpty(TextFilter) Then
    58. allowed = mp3Object.Interpret.ToLower().Contains(TextFilter.ToLower()) OrElse mp3Object.Album.ToLower().Contains(TextFilter.ToLower())
    59. If Not allowed Then Return allowed
    60. End If
    61. For Each selGenre In AnzuzeigendeGenres.Where(Function(g) Not g.IsSelected)
    62. If mp3Object.Genre = selGenre.Genre Then Return False
    63. Next
    64. Return allowed
    65. End Function
    66. Private Sub GenerateGenreList() 'Generiert die Genre-Liste mit dem zusätzlichem Property IsSelected um dieses später auswertuen zu können
    67. Dim aviableGenres = InhaltGesamt.Select(Function(s) s.Genre).Distinct().ToList() 'Erstmal die alle Genres holen aus den MP3 holen (Als Modelobjekte) Distinct() filtert alle Doppelten einträge
    68. Dim returnList = New List(Of GenreViewModel)
    69. aviableGenres.ForEach(Sub(x) returnList.Add(New GenreViewModel(New Genres(x)))) 'Nun aus den Modelobjekten ViewModel Objekte machen
    70. returnList.ForEach(Sub(x) AddHandler x.IsSelectedChanged, AddressOf SelectedGenresChanged) 'Nun für jedes Objekt einen Handler auf das Event in der GenreViewModel-Klasse setzen
    71. _anzuzeigendeGenres = New ObservableCollection(Of GenreViewModel)(returnList)
    72. RaisePropertyChanged(NameOf(AnzuzeigendeGenres))
    73. End Sub
    74. Private _anzuzeigendeGenres As ObservableCollection(Of GenreViewModel)
    75. Public ReadOnly Property AnzuzeigendeGenres As ObservableCollection(Of GenreViewModel)
    76. Get
    77. Return _anzuzeigendeGenres
    78. End Get
    79. End Property
    80. Private Sub SelectedGenresChanged()
    81. RefreshViews()
    82. End Sub
    83. Private Sub RefreshViews() 'Aktualisiert die Views
    84. Mp3FilesView.Refresh() : StreamsView.Refresh()
    85. End Sub
    86. End Class


    Ich hab dir alles soweit mal Kommentiert. Die View hat sich nur insofern geändert das die Bindings aktualisiert wurden damit auf die View gebunden wird.

    PS: Wenn du nicht langsam meine Tutorials ansiehst sehe ich schwarz, du machst dir nur selbst das leben schwer, es gibt sooooo viele tolle Dinge in der Welt der WPF, nutzt du diese nicht weil du nicht mal weist das es sie gibt, stehst du am Ende leider dumm da und machst dir alles nur schwerer.
    PPS: Bevor sowas kommt wie "Aber du hast mir das mit den ObservableCollections gezeigt". Richtig. Du sollst ja auch selbst immer dazu lernen und versuchen deine Wissen aufzubessern. Ich bin jemand der versucht etwas beizubringen und nicht einfach eine Lösung zu servieren, und da darf es dann nicht "perfekt" sein sonst bleibt der Lernprozess aus. Hoffe du nimmst mir das nicht übel aber ich denke so lernt man auch Refaktoring und wie man von einem Rezept zu einem perfektem Gericht kommt.

    Anbei das Projekt.

    Grüße
    Sascha

    Achja, eines noch als Mod @kafffee : Bitte Anhänge (Projekte) bitte unbedingt IMMER bereinigt hochladen. Also ohne "bin" Ordnern. Dies ist verboten.
    In VisualStudio: Rechtklick auf Projektmappe -> Projektmappe bereinigen
    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. ##

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

    Ja, AviableGenres wäre besser.
    Ich glaub für ihm war es so logisch weil er die Doppelten Einträge rausgefiltert hat und wird deshalb die Benamsung gewählt haben. Bin aber eh kein Freund von Deutscher benamsung. Weis nicht, da tu ich mir immer schwer.

    Grüße
    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. ##

    kafffee schrieb:

    Das muss glaube ich einfach an einem fehlenden Aufruf von RefreshView() liegen

    What? du hast in deinem code keine Views (CollectionViews) also was willst du aufrufen. Gehe bitte den Code durch und versuche ihn zu verstehen und SCHAU DIR DAS KAPITEL AN.

    Wo soll ich Anfangen, du gehst sowieso von der falschen Seite ran.

    kafffee schrieb:

    For Each item In AnzuzeigendeGenres
    If item.IstSelektiert = True Then
    AusgewählteGenres.Add(item.Genre)
    End If
    Next


    Du willst ja die Streams filtern und nicht die Genreliste. Warum also diesen code?

    Grüße
    Sascha
    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. ##

    Ich hab doch in der SucheViewModel.vb diese Methode:

    VB.NET-Quellcode

    1. Private Sub RefreshView()
    2. RaisePropertyChanged(NameOf(AnzuzeigendeInterpreten))
    3. RaisePropertyChanged(NameOf(AnzuzeigendeAlben))
    4. RaisePropertyChanged(NameOf(AnzuzeigendeMusiktitel))
    5. RaisePropertyChanged(NameOf(AnzuzeigendeRadiostreams))
    6. End Sub
    Ja, und im Getter hast du zwar folgendes:

    VB.NET-Quellcode

    1. Dim Ablage As New List(Of MP3FileInfo)
    2. For i = 0 To filteredList.Count - 1
    3. If AusgewählteGenres.Contains(filteredList(i).Genre) Then
    4. Ablage.Add(filteredList(i))
    5. End If
    6. Next
    7. filteredList = Ablage

    Was wieder ALLE Einträge hinzufügt weil du nicht abfragst ob der Eintrag ausgewählt ist. Also werden wieder ALLE hinzugefügt.
    Weiters bekommst du eine Änderung in der Gerne-Selektierung ja auch nicht mit da du keinen Handler Abonnierst der dir dies bekanntgibt. Beim ein an/abwählen einer Checkbox in Genres wird ja nirgens ein Setter durchlaufen.

    Grüße
    Sascha
    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. ##

    Hä?
    Ich frage doch ab, ob sie selektiert sind:

    VB.NET-Quellcode

    1. ​Dim AusgewählteGenres As New List(Of String) 'ab hier kann man das glaube ich besser machen mit Linq
    2. For Each item In AnzuzeigendeGenres
    3. If item.IstSelektiert = True Then
    4. AusgewählteGenres.Add(item.Genre)
    5. End If
    6. Next
    7. Dim Ablage As New List(Of MP3FileInfo)
    8. For i = 0 To filteredList.Count - 1
    9. If AusgewählteGenres.Contains(filteredList(i).Genre) Then
    10. Ablage.Add(filteredList(i))
    11. End If
    12. Next


    Und der Setter wird hier in der Klasse Genres durchlaufen:

    VB.NET-Quellcode

    1. Public Property IstSelektiert As Boolean
    2. Get
    3. Return _IstSelektiert
    4. End Get
    5. Set(value As Boolean)
    6. _IstSelektiert = value
    7. End Set
    8. End Property


    Hast dich bestimmt verguckt...
    Ja, es stimmt schon - da gebe ich dir recht, der Code ist aber so verwirrend mit x Listen das man hier nicht wirklich einen überblick hat.
    Habs jetzt nochmal genauer angesehen. (Muss zugeben das ich es nicht wirklich genau durchgegangen bin da mir hier sofort die CollectionViews in den Kopf geschossen sind)

    Du packst ja alle Einträge (wiederum) in eine neue Liste. "Ablage".
    Wandern die korrekten (gefilterten) Einträge in diese Liste oder alle?
    Debugge mal und schau ob "IstSelektiert" auch richtig gesetzt wird oder ob das Binding evtl. nicht passt.

    Aber ich würde mit dem Code sowieso nicht weitermachen, das wird wenn du noch mehr Funktionen implementierst der Horror hier den überblick zu behalten.
    Da hilft nur Debuggen. Ich glaube ja das hier alle Genres übernommen werden, egal was abgewählt ist.

    Grüße
    Sascha
    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. ##

    @Nofear23m

    Ja also der Setter von IstSelektiert wird durchlaufen, aber nicht der Getter von AusgewählteRadiostreams. Somit ist klar dass sich da nix tut. Deswegen meine Frage, ob und wie man jetzt denn vom Setter von IstSelektiert die Methode RefreshView() in der Klasse SucheViewModel aufrufen kann bzw. sollte.

    Ob ich damit weiter mach? Nun bestimmt nicht so wie es jetzt ist. Aber dazu schau ich mir erstmal in Ruhe das Kapitel über CollectionViews an...

    kafffee schrieb:

    Deswegen meine Frage, ob und wie man jetzt denn vom Setter von IstSelektiert die Methode RefreshView() in der Klasse SucheViewModel aufrufen kann

    Aber das habe ich dir ja bereits beantwortet bzw. findest du die Antwort in meinem Projekt auch denn auch ich musste dies machen.

    Nofear23m schrieb:

    Weiters bekommst du eine Änderung in der Gerne-Selektierung ja auch nicht mit da du keinen Handler Abonnierst der dir dies bekanntgibt.

    Und ich habs dir auch kommentiert!!!

    VB.NET-Quellcode

    1. ​returnList.ForEach(Sub(x) AddHandler x.IsSelectedChanged, AddressOf SelectedGenresChanged) 'Nun für jedes Objekt einen Handler auf das Event in der GenreViewModel-Klasse setzen


    Grüße
    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. ##

    Okay so weit war ich noch net. Bin erst die Hälfte deines Codes durch... Bei Rückfragen meld ich mich nochmal...

    Edit: Und hier bin ich wieder:

    Bevor ich anfang loszuproggen: Ich denke ich werde deine Option mit den CollectionViews verwenden, aber werde sie nochmal rewriten. Was ich noch vorhabe einzubauen ist:

    Wenn man in der Listbox für Interpreten nun einen Interpreten per Mausklick auswählt , sollen in der Listbox für die Alben alle Alben angezeigt werden, die genau dieser Künstler gemacht hat, und in der Spalte für Musiktitel ebenfalls alle Titel.
    Dasselbe für Mausklick in Alben und dann alle Titel genau dieses Albums anzeigen.

    Wäre sowas in einem Vierzeiler oder so möglich und ich müsste bloss die MP3ViewsFilter ein bissle umschreiben oder muss ich da das Ganze nochmal komplett neu konzipieren?

    In WinForms kein Problem für mich, aber in der WPF wüsste ich jetzt net wo ich anfangen soll.

    Hättest du mir einen kleinen Tipp oder Denkanstoß?

    Edit:

    @Nofear23m
    So ich denke ich habe deinen Code verstanden jetzt. Bloss eine Sache kapier ich nicht:

    Warum hast du für die Klasse Genres im Model dann nochmal ne Klasse GenreViewModel im ViewModel reingemacht?

    Das verwirrt mich jetzt total... Kann man das nicht in eine Klasse zusammenfassen?

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