Neues Objekt erstellen mittels eines ViewModels

  • WPF

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von flori2212.

    Neues Objekt erstellen mittels eines ViewModels

    Hallo

    ich arbeite nun schon länger an einem WPF Projekt.
    Grob gesagt geht es darum, dass man eine Liste mit Verbrauchern (Consumer) hat. Dieser Verbraucher hat Eigenschaften wie z. B. DeviceID, RoomID die auf ein bestimmtes Gerät, bzw. Raum verweisen. Diese haben wiederum auch eigene Klassen. Zum besseren Verständnis habe ich ein Klassendiagramm angehängt.



    Wie man sieht habe ich für alle Models bereits ein ViewModel (und eine ListViewModel) erstellt.

    Nun zu meiner Frage.

    Ich habe bereits Fenster zum Anzeigen der Verbraucher und Geräte hinzugefügt. Ich brauche nartürlich auch einen Dialog um einen neuen Verbraucher anzulegen.
    Doch woran binde ich die ComboBoxen in dem Dialog (an welches ViewModel bzw. Property)

    Ach ja, das Projekt gibt es auf GitHub unter folgendem Link: GitHub

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor
    Hallo @flori2212

    Du hast ja bereits das Fenster win_add_consumer.

    In diesem erstellst du ein ConsumerListViewModel und nutzt dieses als DatenKontext. Hier ist dein Denkfehler.
    Du brauchst keine Auflistung von Consumern. Du willst ja EINEN Consumer neu hinzufügen.

    Also erstellst du im Constructor einen neuen Consumer. Also eine neue Instanz von ConsumerViewModel und übergibst dieser Instanz die Parameter welche im Constructor benötigt werden.
    Wichtig - da du dich für Integer-Werte für die ID entschieden hast muss du sehen welche die nächste freie ID ist bzw. die höchste verfügbare ID alles Consumers nehmen und um eines hochzählen.

    Bei Klick auf "speichern", "anlagen" oder wie du es dann nennst fügst du das ModelObjekt dann dem Service.Consumers hinzu und speicherst es.
    Wenn der Dialog dann geschlossen wird läuft der Code ja im MainWindow.vb wieder weiter und du kannst hier einen Reload der Liste anstoßen.

    Probier das mal so umzusetzen.

    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

    Nofear23m schrieb:

    In diesem erstellst du ein ConsumerListViewModel und nutzt dieses als DatenKontext. Hier ist dein Denkfehler.
    Du brauchst keine Auflistung von Consumern. Du willst ja EINEN Consumer neu hinzufügen.


    Da hätte ich auch selbst drauf kommen können.

    Nofear23m schrieb:

    Wichtig - da du dich für Integer-Werte für die ID entschieden hast muss du sehen welche die nächste freie ID ist bzw. die höchste verfügbare ID alles Consumers nehmen und um eines hochzählen.


    Welche andere Möglichkeit außer Integerwerte gäbe es für eine ID (ich habe in anderen Posts immer was von einer "GUID" gelesen, wie funktioniert das?)
    Und nur so aus Interesse. Um die aktuell größte ID zu finden gäbe es bestimmt so einen LAMDA Ausdruck, wie würde der lauten. (Ich hätte es wieder mit einer For Each Schleife gelöst)
    Ich wollte eh für alle Models eine Basisklasse machen (ModelBase) die die Eigenschaft ID enthält, weil die brauchen ja eh alle Models.

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor

    flori2212 schrieb:

    Welche andere Möglichkeit außer Integerwerte gäbe es für eine ID (ich habe in anderen Posts immer was von einer "GUID" gelesen, wie funktioniert das?)

    Genau. Mit XMLs ist eine GUID einfacher. Man sollte zwar zur Sicherheit auch prüfen ob eine neu generierte nich vieleicht bereits vorhanden ist, aber das ist einfacher.
    Neue GUID mit ID = New Guid() und prüfen ob eine GUID vorhanden mit If Not ID = Guid.Empty

    flori2212 schrieb:

    Und nur so aus Interesse. Um die aktuell größte ID zu finden gäbe es bestimmt so einen LAMDA Ausdruck, wie würde der lauten. (Ich hätte es wieder mit einer For Each Schleife gelöst)

    z.b.: Dim nextFreeID = Service.DataService.Instance.Consumers.OrderBy(Function(o) o.ID).Last().ID + 1

    flori2212 schrieb:

    Ich wollte eh für alle Models eine Basisklasse machen (ModelBase) die die Eigenschaft ID enthält, weil die brauchen ja eh alle Models.

    Ja, da können auch gleich Eigenschaften wie "CreatedAt" und sowas rein falls sowas man benötigt wird.

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

    Nofear23m schrieb:

    Neue GUID mit ID = New Guid() und prüfen ob eine GUID vorhanden mit If Not ID = Guid.Empty
    Das klingt mir nicht sinnvoll.
    Ich kann mir nicht vorstellen, dass wenn man new Guid() aufruft, dass man dann jemals Guid.Empty zurück-bekommt. Also braucht man das auch nicht zu prüfen.
    Das war ein Fehler von mir der mir erst später aufgefallen ist.

    Neue GUID erstellen mit Guid.NewGuid() und prüfen ob ein Model-Object neu ist mit If consumer.ID = Guid.Empty

    Bin nur noch nicht zum Antworten gekommen. Sorry.

    EDIT:

    ErfinderDesRades schrieb:

    Ich kann mir nicht vorstellen, dass wenn man new Guid() aufruft, dass man dann jemals Guid.Empty zurück-bekommt.

    Genau, weil man Guid.Empty nämlich IMMER zurückbekommt.


    Wie gesagt, mein Fehler. Statt New Guid muss Guid.NewGuid()

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

    @flori2212

    Das du hier geschrieben hast das du nicht klarkommst habe ich mir das mal angesehen und dir ein wenig was umgebaut.
    Bitte am besten im Forum Posten, dann haben alle was davon. Das mit den Issues würde ich dann machen wenn mal die erste Beta draussen ist und nicht merh so viel zu machen ist.

    Hier lesen alle mit und das ist gut so.

    Folgendes Commit: github.com/flori2212/Energieve…160d16482452aa8a26ecf254f
    Man kann hier schön sehen was ich geändert habe. Hier die "Unterhaltung".

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