Klasseneigenschaft an andere Klasseneigenschaft binden

  • WPF

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

    Klasseneigenschaft an andere Klasseneigenschaft binden

    So, einen schönen Sonntag miteinander,

    ich hab da mal ne simple Frage. Kann man mit WPF eine Eigenschaft einer Klasse an eine andere Eigenschaft derselben Klasse binden?

    D.h. dass .Eigenschaft1 geupdatet wird, wenn sich .Eigenschaft2 ändert?

    Oder erwarte ich da zu viel?
    OK ich verstehe worauf du hinaus willst. Ich meinte aber kein Control sondern die Properties einer selbst geschriebenen Klasse.

    Ich lade dir anbei mal mein Projekt hoch.

    Darin habe ich:
    -in der Klasse MainWindow: vier Listboxes: Interpreten, Alben, Musiktitel und Radiostreams
    -in der Klasse Daten: zwei Properties ObservableCollection(Of Class): InhaltGesamt und InhaltGefunden
    -in der Klasse Daten: vier Properties ObservableCollection(Of Class/String): InterpretenAnzuzeigend, AlbenAnzuzeigend usw.

    Nun die Frage:
    Kann ich, wenn sich InhaltGefunden ändert, gleichzeitig InterpretenAnzuzeigend sich dementsprechend ändern lassen?

    Oder ist das sogar alles für die Katz und ich sollte einfach die Listbox mit den Interpreten, Alben etc. mit einem Konverter befüllen, der die Daten aus InhaltGefunden dementsprechend umwandelt.

    Hab mir viel Gedanken genau darüber gemacht und bin drauf gekommen, dass das mit den Konvertern nicht machbar ist und ich es so machen muss, wie ich es gemacht hab.

    Gib gerne auch wenn dir sonst was auffällt deinen Senf dazu (also Lob, Kritik, Verbesserungsvorschläge etc.)

    Leider hab ich es auch noch nicht geschafft, die UI-Elemente direkt über XAML mit den Properties der Klasse Daten zu binden, sondern nur über .ItemsSource = InterpretenAnzuzeigend usw. im Code Behind...

    Und somit fall ich schon wieder in dieses "alte Muster" zurück. Für einen Tipp wäre ich dankbar.

    Und die Methode AllesDurchSuchen() funktioniert auch noch nicht, ich hab das mal zu Debuggen versucht, und bin zu dem Schluss gekommen, dass InhaltGefunden() wohl leer bleibt... Und ich hab aber keinen Plan warum...
    Dateien

    kafffee schrieb:

    Kann ich, wenn sich InhaltGefunden ändert, gleichzeitig InterpretenAnzuzeigend sich dementsprechend ändern lassen?
    ja, was sollte dich hindern?

    VB.NET-Quellcode

    1. Private _InhaltGefunden As ObservableCollection(Of MP3Titelinfo)
    2. Public Property InhaltGefunden() As ObservableCollection(Of MP3Titelinfo)
    3. Get
    4. Return _InhaltGefunden
    5. End Get
    6. Set
    7. If _InhaltGefunden Is Value Then Return
    8. _InhaltGefunden = Value
    9. InterpretenAnzuzeigend = New ObservableCollection(Of String)
    10. End Set
    11. End Property
    Sieht mir aber nicht besonders sinnvoll aus.

    Ich vermute das Problem ist die Fragestellung.
    Beides, InhaltGefunden und InterpretenAnzuzeigend, sind Auflistungen.
    "Auflistung ändern" bedeutet strenggenommen, was ich hier gezeigt habe: Alte Auflistung weg, neue Auflistung hin.
    Vielleicht meinst du aber auch, wenn sich Elemente der Auflistung ändern.
    Und auch das ist zweideutig, denn Elemente können in einer Auflistung zugefügt, entfernt oder ausgetauscht werden.
    Und darüber hinaus können sich auch Properties der Elemente ändern - was ja wieder nochmal was anderes ist.

    Lange Rede kurzer Sinn: Ich verstehe die Frage nicht, weil ich nicht sicher sein kann, was du meinst.

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

    Hallo

    Sorry das ich mich einmische. Das ist ja ein sehr Abenteuerliches vorgehen. Total verkompliziert und ein kompletter Mischmasch aus CodeBehind und Binding.
    Ich bekomme bei den Gettern Augenkrebs und bei vielen anderen Dingen auch.

    Du hast ein Beispiel von mir bekommen wie man ViewModel-Klassen sauber aufbaut inkl. einer Basisklasse. welche INotifyPropertyChanged implementiert. Warum machst du das alles bei jeder Klasse per Hand und warum (oder besser von wo hast du die Idee?) vergewaltigst du die Getter eines Properties so dermaßen?

    Da verstehe ich das du so auf keinen "grünen Zweig" kommst.
    Du solltest dir echt die Beispiele die du bekommst genau ansehen und nachfragen wenn du etwas nicht verstehst anstatt solche wilde Konstrukte zu generieren. Fragen kostet nix und tut nicht weh, wir werden versuchen deine Fragen zu beantworten, das Beispiel hier jetzt mit dir gemeinsam in Textform "aufzudröseln" und dabei zu erklären warum und weshalb würde jeglichen Rahmen sprengen da ich garnicht wüsste wo ich anfangen soll.

    Da dein Projekt ja um einiges größer wird als das in diesem Beispiel würdest du sehr schnell an den Punkt kommen wo du überhaupt nicht mehr durchblickst. Also ich blicke da kaum mehr durch.

    PS: Bitte nicht Böse nehmen, ich meine es gut und gib mir mühe dir das näher zu bringen. Aber du musst die Beispiele und Ratschläge annehmen.

    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. ##

    @ErfinderDesRades

    Die Properties bleiben alle unberührt. Es werden lediglich beim Durchlauf von AllesDurchSuchen(), zuerst InhaltGefunden() mittels .Clear() komplett geleert und dann evtl. gefundene Elemente zugefügt. Erst wenn alle Elemente zugefügt sind, dann soll .AnzuzeigendeInterpreten ein Update erhalten.

    Nofear23m schrieb:

    warum (oder besser von wo hast du die Idee?) vergewaltigst du die Getter eines Properties so dermaßen?

    Yep deswegen frag ich ja. Ich wollte das zuerst mit einem Konverter lösen der sich dann die Daten rauspickt, dachte dann aber, dass das so nicht geht.

    Nofear23m schrieb:

    Total verkompliziert und ein kompletter Mischmasch aus CodeBehind und Binding.

    Genau. Meine konkrete Frage wäre das: Wie kriege ich es ohne Code Behind hin, dass meine Daten in die Listen geladen werden automatisch. Ich hab jetzt gestern den gesamten Nachmittag und heute Mittag auch noch mal das halbe Internet bemüht, Google, Bing, Youtube, drei verschiedene Tutorials, aber ich hab einfach nix gefunden, was mein Problem löst... Ich glaube (!) dass es am XAML-Code liegt, du kannst dir ja dazu mal meine lstInterpreten, lstMusiktitel usw. anschauen...

    kafffee schrieb:

    Die Properties bleiben alle unberührt. Es werden lediglich beim Durchlauf von AllesDurchSuchen(), zuerst InhaltGefunden() mittels .Clear() komplett geleert und dann evtl. gefundene Elemente zugefügt. Erst wenn alle Elemente zugefügt sind, dann soll .AnzuzeigendeInterpreten ein Update erhalten.
    ja, dann programmier das doch.
    Wenn AllesDurchSuchen() fertig ist, dann verschaff .AnzuzeigendeInterpreten ein "Update" (was immer du damit meinst).
    Tatsächlich mischt du hier "alte Programmiertechnik" und "WPF-Behavior" extrem. Und exakt so habe ich auch angefangen. Und der Umstieg ist tatsächlich müßig, lohnt sich aber, wenn man es erstmal verstanden hat, weil einem dann vieles einfacher von der Hand geht.

    Und ich habe da auch ein wenig Problem, deinem Code direkt zu folgen. Was jedoch die beste und einfachste Lösung ist, um das Binding erstmal in den Griff zu bekommen:

    Statt mit 4 Listboxen zu arbeiten, nutze eine ListView und erstelle im Hintergrund ein ViewModel, in welchem die Daten der vier Listboxen enthalten sind. So brauchst du nur eine View und kannst die Daten da einspeichern. Generell müsste dieses ViewModel als Ressource dem Window auch angezeigt werden. Bei dir wird das ja alles in der CodeBehind gemacht.

    Wenn du also ein ViewModel erstellst, kannst du mittels:

    XML-Quellcode

    1. ​ <Window.Resources>
    2. <local:Daten x:Key="DatenVieWModel"/>
    3. </Window.Resources>


    Dieses Modell deinem Window bekanntmachen und als Datenkontext auch darauf zugreifen. Danach solltest du keinen Problem mehr haben, auf die Propertys der Daten zuzugreifen. Sieht in etwa so aus:

    XML-Quellcode

    1. <Window.Resources>
    2. <local:Daten x:Key="DatenVieWModel"/>
    3. </Window.Resources>
    4. <Grid>
    5. <Grid.ColumnDefinitions>
    6. <ColumnDefinition Width="25*"/>
    7. <ColumnDefinition Width="25*"/>
    8. <ColumnDefinition Width="25*"/>
    9. <ColumnDefinition Width="25*"/>
    10. </Grid.ColumnDefinitions>
    11. <Grid.RowDefinitions>
    12. <RowDefinition Height="90*"/>
    13. <RowDefinition Height="10*"/>
    14. </Grid.RowDefinitions>
    15. <ListView DataContext="{StaticResource DatenVieWModel}" ItemsSource="{Binding ElementName=lstInterpreten}">
    16. </ListView>
    17. ....


    ich habe da nun nur mit deinem angefangenen Sachen gearbeitet, aber durch Umstrukturierung kannst du da eine Menge anfangen. Aber du musst wie bei "Windows.Resource" zu sehen ist, deinem Window auch sagen, dass es eine Instanz dieser Klasse braucht. Danach ist sie als statische Ressource auch im Kontext zu finden und VS zeigt sie dir dann auch als Auswahl an. so kannst du mittels XAML binden.
    @PadreSperanza

    Der @Nofear23m hat mir gestern auf Discord noch gründlich den Kopf gewaschen und mit mir zusammen das, was ich hochgeladen hab nochmal komplett neu aufgesetzt nach dem MVVM Pattern. Ich hab mir dann noch die Nacht in die Ohren geschlagen und mir das Ganze in Ruhe mal angesehen und gemerkt, dass es halb so wild ist. Ich muss jetzt mal ein bisschen mit rumspielen und mal gucken wie erfolgreich ich dabei bin. Jedenfalls hab ich beschlossen, jetzt meine Anwendung, die ich ja in Winforms schon fertig hab, nun doch mit MVVM und allen Schikanen neu aufzusetzen und wenn ich weiterhin Spaß daran finde, evtl. auch beruflich mich danach zu orientieren. Aber das liegt glaube ich noch in einiger Ferne...