Auf Variable eines Windows zugreifen(WPF)

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    @asusdk: Warum mein Weg und nicht Deiner? Weil meins läuft und Deins nicht.


    Aber, wenn ich die OOP schon lernen soll, stellt sich mir jetzt folgende Frage:

    Du @VaporiZed sagst ich solle per Eventhandler arbeiten, @Nofear23m hingegen meint weiter oben ich solle stattdessen leiber die Instanz meiner Backendklasse mitgeben, welche der Beiden Wege ist denn nun der richtige? Bzw. der OOP/WPF-konformste ? Sorry das ich hier nachfragen muss aber ich bin zugegebenermaßen etwas verwirrt ^^ Bevorzugen würde ich hier wohl NoFear´s weg aber wenn ich es schon lerne dann richtig, was ist nun der richtige/zu bevorzugende Weg ?
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Das hat das eine mit dem anderen erstmal nichts zu tun.

    Auch bei meinem Code musst du dort wo du es benötigst die Handler abonnieren. Da ändert sich nichts. OK, das habe ich dir im Beispielcode nicht reingemacht, solltest du aber glaube ich selbst schaffen.

    Aber wenn ich die KLasse "Backend" richtig verstehe, bzw. deren Anwendung dann kommt ich zu dem entschluss das du die Events vermutlich gar nicht benötigst. Das nur so am rande.
    Ich persönlich versuche immer Eventrs zu vermeiden. Wenn in einem ViewModel ein "Kunde" hinzugefügt wird (mithilfe des Backends), dann brauche ich hier kein Event geworfen um zu wissen das sich die Auflistung geändert hat. Das weis ich an der Stelle und kann die Auflistung neu laden. Wobei..... nichtmal das muss ich. Ich speichere ein Element in das Backend um dann wieder ALLE Daten neu einzulesen und in ViewModel zu holen? Ne

    Ich erstelle ein Objekt und speichere dieses mithilfe des Backends - und füge dieses gerade erstellte Element direkt in die Auflistung in meinem ViewModel ein. Warum soll ich bitte ALLES nochmals laden. Ich habs ja hier (im ViewModel). Verstehst du was ich meine?

    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 erstelle ein Objekt und speichere dieses mithilfe des Backends - und füge dieses gerade erstellte Element direkt in die Auflistung in meinem ViewModel ein. Warum soll ich bitte ALLES nochmals laden. Ich habs ja hier (im ViewModel). Verstehst du was ich meine?


    Leider versteh ich nicht ganz was du meinst, da ich bisher das Konzept eines Viewmodels nicht verstanden habe, in meinem Kopf stellt sich das wie folgt dar:
    Model(Also z.B. Fahrzeug) -> eine weitere Klasse mit einer Liste aller Fahrzeuge -> ViewModel(was ich mir bislang nur als zusätzlichen Platzhalter vorstelle) und dann eben die GUI die sich die Daten aus dem ViewModel holt. (Empfinde ich an sich als sehr interessantes Konzept, da ich zumindest theoretisch, dann die jeweiligen Controls die meine "Fahrzeuge" enthalten eben nicht jedes mal "von Hand" refreshen muss) Aber wie gesagt, bislang weigert sich mein bescheuertes Hirn, dieses Konzept zu verstehen....


    Aber wenn ich die KLasse "Backend" richtig verstehe, bzw. deren Anwendung dann kommt ich zu dem entschluss das du die Events vermutlich gar nicht benötigst. Das nur so am rande.


    Naja, bisher habe ich ja ausschließlich in Forms gearbeitet, und diesem Thread (und den Tatsachen ^^) zufolge auch nicht OOP-Konform, also war es bisher so, das ich die BackendKlasse mit Events instanziert habe, die Events haben gefeuert sobald sich in der Liste (z.B. List(Of Fahrzeuge)) etwas ändert. In der Form1 habe ich dann einfach, jedes mal wenn dieses Event gefeuert wurde, die jeweilige ListBox, neu geladen, denn die ListBox weiss ja nicht das sich irgendwas geändert hat, die hat ja weiterhin nur die bereits vorhandenen Items, also musste ich der ja sagen, hey, die Liste in der die einzelnen "Fahrzeuge" sind hat sich geändert, musst mal neu laden.

    Dementsprechend hat sich das bisher auch einfach ohne direkten EventHandler (muss ich auch erstmal lernen da bisher nicht von nöten gewesen) regeln lassen, denn ich konnte ja einfach (in der Form1/Hauptfenster) schreiben:

    VB.NET-Quellcode

    1. Private Sub Back_FahrzeugListeChanged() Handles Back.FahrzeugListeChanged
    2. ListBox1.Items.Clear()
    3. For Each faz As Fahrzeug In Back.FahrzeugListe
    4. ListBox1.Items.Add(faz)
    5. Next
    6. End Sub



    Wenn in einem ViewModel ein "Kunde" hinzugefügt wird (mithilfe des Backends), dann brauche ich hier kein Event geworfen um zu wissen das sich die Auflistung geändert hat


    Bisher, bin ich wie oben bereits geschrieben einen anscheinend gänzlich falschen Weg gegangen, natürlich ist mir bekannt an welcher Stelle im Code ich einen Kunden hinzufüge, und ja dann könnte ich "manuell" die Liste neu Laden, nach dem obigen Weg, passierte dies ja von selbst, sobald sich die Liste verändert hat, da ja das Event gefeuert wird/wurde und ich in der Form1 immer beim feuern des Events automatisch die Liste neu geladen habe.

    für den Fall das es dich interessiert wie dies in einem "fertigen Projekt" von mir aussieht, und falls du, auch nachdem ich manchmal so verbohrt bin, mir noch immer helfen wollen, habe ich das Projekt in dem ich dieses Konzept angewendet habe mal mit angehängt (Hoffentlich korrekt, soweit ich mich an einen Beitrag von dir in einem anderen Thread erinnere, vorher einmal bereinigt, und den obj-Ordner hab ich auch rausgenommen da ja keine .exe-files erwünscht sind). evtl. siehst du ja anhand dessen bereits warum mir alleine das Konzept der OOP und damit auch der WPF bisher, ohne Übertreibung wirklich, wie eine vollständig andere Welt/Programmiersprache vorkommt....


    LG

    Nachtrag: Ich bin mir sicher das sich die meisten von euch das "bildliche Übergeben" verkneifen müssen, da mit sicherheit ettliches in meinem Projekt unnötig und vollständig falsch ist, aber naja "zumindest erfüllt es seinen Zweck ", ist bestimmt generell überarbeitungswürdig, aber ja, da mangelts es mir vermutlich noch an viiiielem
    Dateien
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    asusdk schrieb:

    bislang weigert sich mein bescheuertes Hirn, dieses Konzept zu verstehen....

    Verstehe ich. Du bist es gewohnt sehr linear zu denken. Da musst du nun ein wenig umdenken. Das Konzept ansich hast du ja schon recht gut verstanden.
    Das ViewModel bildet deine View ab. Im groben kann man sagen das wenn ich ein ViewModel sehe (mit dessen Properties und Commands) weis ich wie in etwa die View aussieht.
    Natürlich nicht genau. Ob da jetzt ne Listbox oder ein DataGrid eine Liste anzeigt ist erstmal egal. Ich sehe eine Collection im ViewModel und weis ich werde im View dann eine Liste von etwas sehen.

    Genauso ist es umgekehrt. Wenn ich eine View sehe (wie deine in dem Beispiel) sehe ich ein ViewModel vor meinem inneren Auge. Klar, das muss man trainieren - kommt aber von selbst.
    Wenn ich die View sehe dann weis ich genau was ich brauche. Weil für jede Textbox gibt es ein Property, für jeden Button gibt es einen Command, für jede ListBox gibt es eine ObservableCollection und ein Property "SelectedItem". usw.

    Aber wirst sehen, das kommt von selbst - du musst es nur zulassen. Solche Grundsatzdiskussionen wie die warum OOP bringen dir nichts. Das hintert dich nur - lass es einfach zu. :|

    Ich habe mir dein Beispiel angesehen. Nicht den Code - nur das Ergebnis und muss sagen. Das ist sogar GENAU das richtige Beispiel um MVVM zu lernen. Keine Dialoge (fast) und keine besondere Benutzerführung. (z.b. das man auf einen anderen Reiter muss um Artikel anzulegen, hier würde ich in der Ansicht mit der Artikelübersicht einen "Add Article" Button machen wo ein Dialog aufgeht und dort lege ich einen neuen Artikel an. Nach schliessen des Dialogs ist dieser dann auch in der Liste. Aber gut. Jeder machts anders.
    Aber ansich ist dieses Beispiel ideal. Ich würde für den Anfang jetzt für dich nicht direkt MVVM anpeilen. Das wäre zu viel für dich. Aber ich würde Binding verwenden. Also Quasi ViewModel-Klassen, nur das drumherum mit Services für Fenster, Dialoge, Messageboxen und der gleichen würde ich Anfangs weglassen. Das kann man später noch einbauen. Diese Dinge kann man derweil anders lösen. (Bringt ja nix wenn du dich überforderst)

    Ich gebe dir nur einen Rat. Versuche nicht diese Anwendung nun so 1:1 in WPF zu bauen. Das wird nix. Sie kann zwar gleich aussehen am ende, aber der Aufbau ist ein anderer.
    Gerne können wir das mitunter gemeinsam hier in der Community machen, dafür solltest du aber einen eigenen Thread aufmachen. Dann können wir anfangen mit einem Konzept und dieses Stück für Stück aufbauen.

    Vorausgesetzt natürlich du willst nun doch OOP lernen.

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

    Hallo,

    Nofear23m schrieb:

    Verstehe ich. Du bist es gewohnt sehr linear zu denken. Da musst du nun ein wenig umdenken

    Glaub mir, das ist wirklich so. Bei meinen WPF Anfängen (vor ca. 1/4 Jahr) ging es mir genau so.
    Einerseits habe ich das System nicht richtig verstanden, andererseits war mir nicht klar wofür das Ganze, wo es doch auch davor funktioniert hat.
    Aber wenn man es erst mal so macht will man nicht mehr zurück.

    Nofear23m schrieb:

    Aber wirst sehen, das kommt von selbst - du musst es nur zulassen

    KAnn ich auch nur zustimmen.
    Je mehr Projekte du so aufsetzt desto leichter wird es dir fallen zu deinen Ideen ein passendes ViewModel zu designen

    Nofear23m schrieb:

    Also Quasi ViewModel-Klassen, nur das drumherum mit Services für Fenster, Dialoge, Messageboxen und der gleichen würde ich Anfangs weglassen. Das kann man später noch einbauen. Diese Dinge kann man derweil anders lösen. (Bringt ja nix wenn du dich überforderst)

    Genau so habe ich es auch die Zeit über gemacht, jetzt wo ich das andere gut kann, kann man ja die anderen Sachen (wie Services) hinzulernen.

    Nofear23m schrieb:

    Gerne können wir das mitunter gemeinsam hier in der Community machen, dafür solltest du aber einen eigenen Thread aufmachen. Dann können wir anfangen mit einem Konzept und dieses Stück für Stück aufbauen.

    Ich denke das ist eine gute Idee, ich bin auch gerne bereit, dir dabei zu helfen.
    Nofear23m hat mir auch bei meinem ersten WPF Projekt geholfen, das ViewModel und so weiter aufzusetzen und es hat mir sehr geholfen. Jetzt kann ich es auch (meistens :) ) alleine.

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor
    Hi, @Nofear23m und @flori2212

    vielen Dank euch beiden für die angebotene Hilfe, leider habe ich erst jetzt geantwortet, da ich schon einmal eine Projektmappe vorbereitet habe, den Thread den ich aufgemacht habe findet Ihr hier.

    Vielen vielen dank schonmal =)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If