Überwachen einer ObservableCollection mittels .CollectionChanged

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

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Überwachen einer ObservableCollection mittels .CollectionChanged

    Hallo Leute :)

    bin gerade beim Debuggen auf ein Problem gestossen, wo ich jetzt keine Idee mehr habe:

    VB.NET-Quellcode

    1. Dim NeueAudioDateien As IEnumerable(Of String) = GeholteDateien.Except(MainModule.InhaltGesamt.Select(Function(x) x.Dateiname))


    Und zwar sollen hier in NeueAudioDateien alle Dateien, die in GeholteDateien enthalten sind, ausser die, die schon in InhaltGesamt in der Property Dateiname enthalten sind, gespeichert werden.

    Funktioniert soweit auch, bloss wenn ich einen Haltepunkt setze, dann ist InhaltGesamt.Count = 0, was eigentlich nicht sein kann bzw. soll. Folglich werden alle GeholtenDateien übernommen.

    Also hab ich mir so meine Gedanken gemacht, warum InhaltGesamt.Count = 0 ist, denn ich verwende nirgends die .Clear-Methode, zumindest hab ich es nicht gefunden.

    Also war meine Idee, InhaltGesamt zu überwachen, und wenn .Count = 0 ist, dass ich dann eine Debuggerausgabe bekomme:

    VB.NET-Quellcode

    1. Public Sub New()
    2. AddHandler InhaltGesamt.CollectionChanged, AddressOf InhaltUeberwachung
    3. End Sub
    4. Public Sub InhaltUeberwachung(sender As Object, e As NotifyCollectionChangedEventArgs)
    5. If InhaltGesamt.Count = 0 Then 'hier habe ich einen Haltepunkt gesetzt.
    6. Debug.WriteLine("InhaltGesamt hat jetzt " & InhaltGesamt.Count & " Items...")
    7. End If
    8. End Sub


    Bloss kommt nichts in der Debuggger-Ausgabe, ja InhaltUeberwaschung wird gar nicht erst ausgeführt. Weiss jemand vielleicht warum? Weil spätestens beim Initialisieren meiner App werden Items zu InhaltGesamt zugefügt da müsste es eigentlich anspringen...

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

    Das ist ja sicherlich ein Klasseninstanzvergleich. Ist sicher, dass in GeholteDateien und MainModule.InhaltGesamt dieselben Klasseninstanzen drin sind? Dateinamengleichheit heißt schließlich nicht: selbe Klasseninstanz. Wenn nur Dateinamengleichheit besteht, dann musst Du die Instanzen rausfischen, die den selben Dateinamenpfad haben; dann ist es egal, ob es dieselben Klasseninstanzen sind.
    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.
    Okay also zur Info:

    GeholteDateien ist eine List(Of String), Inhaltgesamt eine List(Of Class) mit der Eigenschaft Dateiname.

    Trotzdem?

    Und erklärt das auch, dass ich keine Benachrichtigung bekomme, wenn sich was ändert? Weil InhaltGesamt gibt's eigentlich nur ein Mal, denke ich.

    Wie kann ich die richtige Instanz herausfischen?
    Sind die Dateinamen/Pfade vollständig und in der Großschreibung identisch? Mach mal einen Haltepunkt in der Zeile und schau nach, was konkret in GeholteDateien und in MainModule.InhaltGesamt.Select(Function(x) x.Dateiname) drinsteht. Für letzteres: Pack diese Dateinamen zum Testen in eine eigene Variable, also
    Dim Foo = MainModule.InhaltGesamt.Select(Function(x) x.Dateiname)

    Mach auch testweise mal ein .ToArray am Ende der Abfrage.
    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.

    VaporiZed schrieb:

    Sind die Dateinamen/Pfade vollständig und in der Großschreibung identisch?

    Ja, da ist mir was eingefallen. Die Einträge in InhaltGesamt.Dateiname fangen alle mit \\?\ an. Also hab ich das auch zu allen Einträgen von GeholteDateien zugefügt (s. Screenshot). Bloss wenn ich mit der Maus dann über GeholteDateien hovere, wird dies nicht angezeigt (s. auch Screenshot). Komisch oder?

    Foo hat dabei eine Length von 0.

    @ErfinderDesRades
    Würde in dem Fall mein .CollectionChanged gefeuert? Hab jetzt erstmal nichts dergleichen gefunden...
    Bilder
    • screenshot20231027.png

      132,44 kB, 1.796×371, 44 mal angesehen
    Foo hat keine Einträge? Dann stimmt da aber grundsätzlich was ncht. Geh dem auf den Grund. Wenn Foo leer ist, kann natürlich auch nix ausgenommen (Except) werden.
    Ich seh grad: In Post#1 steht ja schon, dass MainModule.InhaltGesamt leer ist. Das ist ja das eigentliche Problem. Was ist MainModule? Wird in MainModule irgendwann diese InhaltGesamt-Geschichte geladen? Vor dem Zeitpunkt, bei dem Du das Except aufrufst? Mach einen Haltepunkt bei Except und vor und nach dem Datenladen, dann weißt Du ja auch, in welcher Reihenfolge die Zeilen abgearbeitet werden. Stell auch sicher, dass wirklich dauerhaft die Dateien in InhaltGesamt landen und Du sie von dort aufrufen kannst, wo Du das vorhast.
    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.
    @VaporiZed

    Jou ich hab das .Clear gefunden. War in einer abzweigenden Funktion, deshalb hab ichs nicht gleich gefunden. .CollectinChanged wird wahrscheinlich bei einem .Clear gar nicht gefeuert...

    Foo hat jetzt auch dementsprechend die Einträge. Aber dat will immer noch nicht. Das Problem jetzt liegt meiner Meinung nach eindeutig darin, dass die GeholteDateien nicht mit \\?\ anfangen, dabei hab ich das doch explizit zugefügt....?? Sieh dir mal den Screenshot an (die For...Next-Schleife), ich wüsste nicht warum das nicht übernommen wird...
    Strings kannst Du so nicht manipulieren, da kein Verweistyp, siehe Screenshot bzw. VS-Meldung. Nimm eine For-Schleife.
    Bilder
    • nope.png

      14,59 kB, 586×160, 38 mal angesehen
    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.