Problem beim Binden eines Properties vom Typ BindingList

  • VB.NET

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

    Problem beim Binden eines Properties vom Typ BindingList

    Hi,

    ich bin gerade dabei mich in das Thema "Databindung" einzuarbeiten und habe ein Problem mit der realiserung foglendes Sachverhaltes:

    Ich habe eine KlasseA, welche verschiedene Properties beinhaltet.
    Unter anderem auch eine BindingList of KlasseB.

    Die KlasseB beinhaltet ebenfals ein par Properties, unter anderem auch eine BindingList of String.
    Was aktuell nicht funktioniert, und wo ich nicht weiter komme, ist die Ausgabe dieses Properties KlasseB von KlasseA in einer gebundenen ListBox.

    Jetzt habe ich mir eine BindingList von KlasseA erstellt und lasse mir ein par Properteis von KlasseA ausgeben und kann diese auch eingeben.
    D.h.: die DataBindung funktioniert prinzipiell.
    Die Ausgabe der BindingList Of KlasseA erfolgt in einer ListBox, die Ausgabe der Properteis von KlasseA erfolgt in 2 TextBoxen.
    Gecodet ist das ganze Folgendermaßen:

    VB.NET-Quellcode

    1. LB_A_Ausgabe.DataSource = _bindinListA
    2. SourceTextBox.DataBindings.Add("Text", _bindinListA;"SourceLocation")
    3. DestinationTextBox.DataBindings.Add("Text", _bindinListA;"DestinationLocation")


    Wie kann ich jetzt aber die BindinList of KlasseB, welche als Propertie in der KlasseA enthalten ist an eine ListBox binden?
    Da KlasseB ein Propery von KlasseA ist, welche selbst wieder in einer BindingList steckt kann ich es ja nicht folgendermaßen realisieren:

    VB.NET-Quellcode

    1. LB_B_Ausgabe.DataSource = _bindinListA


    Hoffe es ist verständlich geworden was Mein Problem ist und mir kann jemand weiter helfen.

    mfg
    Eine BindingList signalisiert wenn Items zu der Liste hinzukommen/gelöscht werden, aber nicht wenn sich die Properties der Items ändern.

    Wenn Du also die Property KlasseB änderst bekommt Deine Listbox_A das erstmal nicht mit. Normalerweise codet man dafür ein Event , z.B. INotifyPropertyChanged. Das könntest Du z.B. Abfangen um damit die Listbox_B.Datasource auf die BindingListB zu setzen.
    Hmmm, danke für die schnelle Erklärung, aber so richtig bringt mich das nicht weiter.
    Das INotyfChanged Interface habe ich implementiert, und beim änderen eines Attributes feuer ich auch das entsprechende Event samt dem Namen das geänderten Propertys.

    Mein Problem ist nur, das ich nicht weis wie ich KlasseB an eine ListBox binde, bzw besser gesagt wann ich das tuen muss.
    Das Binden meiner "globalen" Liste, also der List Of KlasseA kann ich z.b. im Load Event der Form machen.
    Aber wann /wo/wie ich die BindingList Of KlasseB an die entsprechende ListBox binde weis ich nicht.

    Ach das mit dem registrieren des Events der KlasseB habe ich entweder nicht richtig verstanden, oder es kann nicht funktionieren was du geschrieben hast, denn:
    KlasseB ist ein Property von KlasseA.
    Eine List Of KlasseA wird als DataSource an eine ListBox gebunden.
    Wenn sich ein Property der BindingList of KlasseB ändert, kann ich doch das entsprechende Property nicht an eine ListBox binden, da KlasseB ja die ListBox, bzw die GUI überhaupt nicht kennt, sonden nur seine "Parent" Klasse, also KlasseA.


    mfg
    Es war so gemeint:

    Form Load:
    - Listbox_A.Datasource=KlasseA
    - Addhandler KlasseA.KlasseB.NotifyChangedEvent, AdressOf KlasseBChangedEventHandler
    - KlasseBChanged aufrufen

    KlasseBChangedEventHandler:
    - ListBox_B.Datasource=ListboxA.KlasseB

    Wobei ich der Einfachheit halber KlasseB als Synonym für die Property genommen habe.
    Hi,

    habe mir jetzt ein Einfacheres Beispiel gesucht:
    Länderlist mit Stadtzuordnug jedes Landes, das beinhaltet mein gepostetes Problem, nur aufs wesentliche beschränkt.
    Funktioniert auch alles soweit.

    Das einzige was mir noch unklar ist, ist folgendes:
    Ich habe eine BindingList of String, welche als DataSource einer ListBox zugeordnet ist. (die "LänderListe").
    Je nachdem welcher Eintrag in der "LänderListBox" ausgewählt ist, wird in der "StadtList" die zuordnung zwischen Land /Städten korrekt dargestellt,sprich es werden nur Länder aus dem jeweiligem Land angezeigt.

    Wenn ich ein anderes Land in der ListBox anklicke wird auch die StadtListBox korrekt aktualisiert.
    Gelöst habe ich das ganze aktuell folgendermaßen:

    Beim SelectedIndexChanged des Land-ListBox herausfinden welches das SelectedItem ist.
    Das Selected Item als Grundlage für die DataSource der 2ten Liste ("StadtList" nehmen)

    Gibt es eine Lösung, wo mir die BindingListe sagen kann welches Item das aktuell "dargestellte"/ausgwählte ist , oder kann die BindingList dies nicht wissen?
    Ich finde es etwas seltsam das ich über das Item Property der "Land-LB" die DataSource der "Stadt-LB" setze.

    Um es etwas zu verdeutlichen was ich meine hier der relevante Code:

    VB.NET-Quellcode

    1. Private Sub landListBox_SelectedIndexChanged(sender As Object, e As EventArgs)
    2. If TryCast(sender, ListBox).SelectedItem IsNot Nothing AndAlso TryCast(sender, ListBox).SelectedItem.[GetType]() = GetType(Land) Then
    3. Dim _land As Land = TryCast(TryCast(sender, ListBox).SelectedItem, Land)
    4. UpdateLandGUI(_land)
    5. End If
    6. End Sub


    In "UpdateGUI" findet die zuordnung der DataSource statt.
    Also irgendwie scheine ich die BindingSource falsch zu verwenden.
    Ich bekomme mit dem CurrencyManager nichts ausgelesen.
    Auch wird die "List" nicht mit Werten gefüllt.

    Vielleicht habe ich das Prinzip falsch verstanden, aber für mich "funktioniert" eine BindingSource folgendermaßen:
    Sie soll die Bindung von (Binding)Listen und Controls vereinfachen.
    Durch die DataSource Eigenschaft wird bekannt gemacht welches BindingList angebunden werden soll.
    Durch die DataMember Eigenschaft kann das Binden an ein Controls eingeschrängt werden, wenn mehrere Properties in der "DataSource" vorhandne sind kann das gewünschte Property dadurch angegeben werden.
    Aber genau das Scheint nicht zu klappen, bzw nicht so wie ich es geschildert habe.

    Kannst mir vielleicht jemand den Aufruf, bzw die Eigenschaften etwas erklären?
    Mit der MSDN komme ich auch nicht wirklich weiter.
    Dort gibt es zwar etliche Beispiel mir Datenbank zugriffen, aber die nützen mir nichts, da ich keine DB nutze, sondern (Binding)Listen und Controls zum anzeigen dieser Listen.

    Mein aufruf sieht folgendermaßen aus:
    Globale "BindingSource" Klasse instanziert durch Konstuktor aufruf mit meiner BindinList (Of Land) + dem PropertyNamen den ich in der Liste Sehen möchte.
    Durch das Hinzufügen von Items zur BindingList wird diese Zwar gefüllt, aber die BindinSource "List"-Property bleibt auf 0.
    Das Binden an die gewünscht ListBox funktioniert auch, denn ein Hinzugefügtes "Land" wird auch korrekt angezeigt, nur kann ich wie gesagt den CurrencyManager nicht nutzen und die List-Property bleibt leer.

    P.S.: durch ein bindingSource.AddNew() wird der List-Property ein Item vom Typ "Char" hinzugefügt ??? Keine Ahnung wie ich damit umgehen soll.


    mfg
    So, jetzt läufts :)

    Hab vor lauter MSDN lesen dein gepostetes beispiel vergessen / übersehen.
    Mein Fehler war das ich die Dataource falsch gesetzt habe, wie's richtig geht sieht man in dem Beispiel ganz gut.

    Mit der Binding Source ist das ganze ja ziemlich einfach / schnell / komfortabel machbar.
    Besten dank für dein Link aus Post#6.

    Und, INotifyPropertyChanged ist nicht mehr notwendig.Spart auch Implementierungsaufwand.

    mfg