Probleme beim Verwalten einer ObservableCollection

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Probleme beim Verwalten einer ObservableCollection

    Hi Community:-)

    ich hab ein, bzw. zwei Probleme mit einer ObservableCollection. Und zwar soll zu AnzuzeigendeGenres neue Genres hinzugefügt werden, wenn noch nicht vorhanden, und dann alphabetisch sortiert werden:

    VB.NET-Quellcode

    1. Public Sub AddeGenres(NeueGenres As List(Of String))
    2. For Each NeuesGenre In NeueGenres
    3. If Not AnzuzeigendeGenres.Contains(New GenresViewModel(New Genres(NeuesGenre))) Then 'diese Zeile geht auch bestimmt noch übersichtlicher...?
    4. AnzuzeigendeGenres.Add(New GenresViewModel(New Genres(NeuesGenre)))
    5. End If
    6. Next
    7. AnzuzeigendeGenres.OrderBy(Function(x) x.Genre) 'x.Genre ist ein String
    8. End Sub


    Das hier ist der Konstruktor von GenresViewModel:

    VB.NET-Quellcode

    1. Public Sub New(varGenreModel As Model.Genres)
    2. Objekt = varGenreModel
    3. End Sub


    und das hier von Genres:

    VB.NET-Quellcode

    1. Public Sub New(varGenre As String)
    2. If varGenre Is Nothing Then
    3. Throw New ArgumentNullException(NameOf(varGenre))
    4. End If
    5. Me.Genre = varGenre
    6. End Sub


    Und zwar werden weder bereits vorhandene Einträge(Genres) aussortiert noch werden diese am Ende alphabetisch sortiert
    Wenn Du keine besondere Überladung von Contains hast, wird das hier IMMER zutreffen:

    kafffee schrieb:

    If Not AnzuzeigendeGenres.Contains(New GenresViewModel(New Genres(NeuesGenre)))
    Eine neu erschaffene Klasseninstanz ist neu. Und wird daher nie in irgeneiner Sammlung auffindbar sein, da von Haus aus Instanzvergleiche gemacht werden, keine inhaltsvergleiche.

    Und ja, es geht z.B. so etwas übersichtlicher - auch wenn das das o.g. Problem nicht löst:

    VB.NET-Quellcode

    1. For Each NeuesGenre In NeueGenres
    2. Dim NeuesGenreViewModel = New GenresViewModel(New Genres(NeuesGenre))
    3. If Not AnzuzeigendeGenres.Contains(NeuesGenreViewModel) Then AnzuzeigendeGenres.Add(NeuesGenreViewModel)
    4. Next

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Mit LINQ, kannst Du die bisherigen Genres prüfen:

    VB.NET-Quellcode

    1. Public Sub AddGenres(NeueGenres As List(Of String)) 'Name angepasst
    2. For Each NeuesGenre In NeueGenres
    3. If AnzuzeigendeGenres.Any(Function(x) x.Genre = NeuesGenre)) Then Continue For
    4. AnzuzeigendeGenres.Add(New GenresViewModel(New Genres(NeuesGenre)))
    5. Next
    6. 'der folgende Code gibt Dir eine sortierte Liste wieder. Da Du aber nix damit machst, passiert auch nix. Das ist wie mit "Test".Replace("s", "x"). Ohne weitere Zuweisung kein Effekt
    7. AnzuzeigendeGenres.OrderBy(Function(x) x.Genre)
    8. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Haudruferzappeltnoch schrieb:

    dann musst du IEquatable implementiere
    da hängt aber ein Rattenschwanz dran, weil dann verhält sich ja a = b anders als a.Equals(b). Und das Verhalten in einem Dictionay(Of TT2 vermutlich auch, weil Dictionay(Of T, T2) geht glaub über T.GetHashcode().

    Muss man halt überlegen, ob man mit diesen Verhaltens-Inkonsistenzen leben will, weil mans nur für die CollectionViews eines Viewmodels braucht.
    Oder ebnen den Aufwand betreiben, die anderen Vergleicheauch alle zu re-implementieren.