Announcement

Collapse
No announcement yet.

WPF-Globale Objekte

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WPF-Globale Objekte

    Hi,

    ich muss mich leider wieder mal an euch wenden. Ich muss im Rahmen eines Projektes ein Szenario als WPF und auf MVVM-Basis umsetzen. Leider es ist für mich schwieriger als ich es zu Anfang dachte. Das Szenario ist folgendes:

    es gibt drei WPF-Forms (z. B. al TabForms): A - B - C mit den jeweiligen ModelViews und Models: AViewModel, BViewModel, und CViewModel. Der Klassenaubau ist so:

    A kann 0 bis viele B beinhalten
    B beinhaltet jeweils eine A und eine C und
    C kann 0 bis viele B beinhalten.


    A--1--------0-*--B--0-*----------1--C


    Diese drei Klassen haben keine Kenntnis voneinander.
    Angefangen bmit A soll nun nach einem Klick auf einen Butten ein Objekt von AModel-Klasse erzeugt werden, das in B und in eine Property hinterlegt werden muss. Das passiert auch bei C in derselben Weise. Danach muss sie aneinander zugewisen werden.

    Meine Frage ist nun: Wie sollen die Objekte erzeugt werden. Ich erzeuge nämlich ein Objekt über DataContext = new AViewModel();, über das die Benutzereingaben in AModel gespeichert werden. Aber wie kann ich dieses Objekt B zur Verfügung stellen? Ich muss in der Lage sein, mehrere Objekte von jeder Kalsse erzeugen zu können.

    Ich habe versucht diese Objekte über APP.cs global erzeugen und jedes mal in eine Liste speichern. Das ging aber nicht, da verständlicherwiese wurden alle gespeicherten Objekte mit dem Inhalt des letzten Objekt überschrieben und hatten alle danach denselben Inhalt.

    Wenn wir bei A bleiben würden: Ich klicke den Button "Neu" und da erscheint ein WPF-Form mit z. B. zwei Feldern Name und Vorname. Nach den ausfüllen der Felder klicke ich auf save und dann wider auf Neu. Wie geht da man vor, um das erste Objekt (global) zu speichern und ein neues zu erzeugen, um neuen Name und Vorname einzugeben usw.?

    Wie ist die Vorgehensweise in solchen Fälle?

    Danke im Voraus

  • #2
    Hallo Smart,

    Das Model-View-ViewModel (MVVM) Entwurfsmuster für WPF kennst du und hast es auch verstanden? Wenn nicht, schaus dir an und dann solltest du dein Design überdenken.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo,

      vielen Dank für die Antwort. Das Beispiel ist zwar genau das, was ich umsetzen muss, ist aber so kompliziert, dass ich kaum verstehen kann, wie das Ganze funktioniert und wie die Zusammenhänge sind. Ich kann momentan auch nicht dahinter kommen, warum wird ein Obejekt, das ich in AviewModel vom Typ AModel erzeuge und in eine Liste speichere, vom zweiten Objekt, das ich auf derselben Weise erzeuge überschrieben wird.

      Gruß

      Comment


      • #4
        Hallo Smart,

        st aber so kompliziert, dass ich kaum verstehen kann, wie das Ganze funktioniert und wie die Zusammenhänge sind.
        hier kann ich dir raten, dass du das gleiche Programm selbst nachbaust. Den Code aus dem Artikel kannst du ja runterladen. Hantle dich dann einfach danach entlang und somit wirst du mehr davon verstehen.

        warum wird ein Obejekt, das ich in AviewModel vom Typ AModel erzeuge und in eine Liste speichere, vom zweiten Objekt, das ich auf derselben Weise erzeuge überschrieben wird.
        Ich versteh diese Frage nicht und kann mich nicht erinnern, dass im Artikel bzw. in diesem Beispielprojekt sowas passiert. Kannst du genauer werden?

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hi,

          vielen Dank für die nette Erklärung.
          Nehmen wir an, ich hätte eine Klasse Person und ich mochte von dieser Klasse mehrere Objekte erzeugen und in einer ObervableCollection<Person> speichern. Ich habe mir als Beispiel 3 Klassen angelegt. View:MainWindow.xaml, Model: Person und ViewModel:PersonViewModel. In Person habe ich zwei Properties Name und Vorname. Ich PersonViewModel habe ich eine Property vom Typ Person, über die auf die Klasse Person und deren Eigenschften zugreife.

          In MainWindow.xaml habe ich zwei TextFelder und ein zwei Buttons, New und Save. Ich habe mir eine vierte Klasse namens Data angelegt, in der ich meine Person-Objekte in einer ObervableCollection<Person> speichere. Also wie unten:

          Code:
          public partial class MainWindow : Window
          {
               DataContext = new PersonViewModel();
          }
          
          public class PersonViewModel
          {
          
                  public PersonViewModel() {
                      this.PersonButtonCommand = new DelegateCommand(this.OnSave);
                      this.PersonNewButtonCommand = new DelegateCommand(this.OnNew);
                  }
          
                  private Person person;
                  public Person Person
                  {
                      get { return person; }
                      set {
                          if (person != value) {
                              person = value;
                              OnPropertyChanged("Person");
                          }
                      }
                  }
          }
          
          public class Person
          {
              public string Name{get; set;}
              public string Vorname{get; set;}
          }
          
          public class Data
          {
               ObservableCollection<Person> personList = new ObservableCollection<Person>();
          
                  public void addPerson(Person person) {
                      personList.Add(person);
                  }
          }
          Ich erzeuge in der Methode OnNew jedes mal person = new Person(); und speichere ich die dann in
          der Methode OnSave in der personList. Das Problem ist nun, dass das letzte Objekt alle anderen überschreibt.

          Gruß
          Zuletzt editiert von Smart; 17.05.2012, 16:21.

          Comment


          • #6
            Hallo Smart,

            im Beispiel aus dem Artikel ist es mMn doch gut beschrieben, nur statt Person wird dort Customer verwendet. Schau dir das Beispiel nochmal genau an - ich könnte nur ähnliches wiedergeben.

            Daher hier nur soviel: Im PersonViewModel hast du keine Propery Person, sondern die Person wird als Feld gespeichert. Stattdessen hast du im VM auch ein Name- und Vorname-Property, die im Getter und Setter auf das Person-Feld zugreifen. Das VM ist hier grob als Wrapper für Person (das Model) zu verstehen und bereitet das Model für die View auf.


            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Hi,

              vielen Dank. Was meinst du mit "als Feld gespeichert". Dieses Feld muss doch irgendwo gespeichert werden, aber wo. Das ist ja das Problem. Es muss auch m. E. mehrere Person-Objekte geben.

              Gruß

              Comment


              • #8
                Hallo,

                ein Feld ist sowas:
                [highlight=c#]
                public class PersonViewModel : INotifyPropertyChanged
                {
                private Person _person; // <- das ist ein Feld

                ...
                }
                [/highlight]

                Aber schau dir doch den Artikel und das Beispiel an, dort siehst du wie es gemacht wird. Eine bessere Vorlage bzw. Muster findest du kaum nochmal.


                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment

                Working...
                X