Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

16.06.2015, 18:20

Ja, ich habe das MVVM-Pattern wie es beschrieben ist, implementiert. ... Allerdings habe ich nur eine Zweiteilung und keine Dreiteilung - das ViewModel in der "Mitte" fehlt bei mir. Ist das schlimm?


Leider wiederspricht der erste Satz dem Zweiten. Wenn du dich nur an das hältst was dir am besten gefällt, heißt das nicht, dass du dich an ein Pattern hältst. Allerdings ist das nicht schlimm im Sinne von
... es wird so nicht funktionieren ... es wird auch so funktionieren. Nur wirst du so keinen großen Benefit aus der Nutzung von WPF ziehen, da WPF Hand in Hand mit dem MVVM-Pattern entwickelt wurde und auch so genutzt werden sollte.

Ich versuche mal Licht ins Dunkel zu bringen: Die Eigenschaften meiner Klassen, die ich in WPF anzeigen möchte, habe ich jetzt mit "INotifyPropertyChanged-Logik" versehen. Die GUI enthält im Code-Behind eine ObservableCollection, mit mehreren Klassenobjekten. In XAML programmiere ich dann DataTemplates, die die Klassen anzeigen können, indem sie Steuerelemente mit {Binding Path=PropertyName} an meine Klasse binden. Dann binde ich ein ItemsControl an die ObservableCollection, dass mir die Klassen dann anzeigt. So habe ich MVVM verstanden!?


Das hat leider wenig mit MVVM zu tun. Wie schon von BlueCobold gesagt, du nutzt WPF schlicht wie WinForms mit INotifyPropertyChanged-Interface als Zusatz. Beim MVVM-Pattern geht es um
die Trennung der Oberflächenbeschreibung (View) von derBuisnesslogik (ViewModel + Models). In deinem Falle wäre deine Oberfläche die View (Window oder UserControls oder beides in Kombination),
deren DataContext-Properties die entsprechenden ViewModels zugewiesen bekommen.
Deine eigenen Klassen wiederum stellen die Models dar und werden in den ViewModels instanziert.

Zumindest sollte die Nutzung das INotifyPropertyChanged-Interface die ganze Sache übersichtlicher machen als wie schon vorgeschlagen, eine wahrscheinlich riesige Funktion zu schreiben,
in der alles auf den aktuellen Stand gebracht wird.

MFG

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

12

16.06.2015, 18:32

In deinem Falle wäre deine Oberfläche die View (Window oder UserControls oder beides in Kombination), deren DataContext-Properties die entsprechenden ViewModels zugewiesen bekommen. Deine eigenen Klassen wiederum stellen die Models dar und werden in den ViewModels instanziert.
Ahh, dann geht es also darum, ein ViewModel als DataContext zu verwenden? Und das ViewModel soll dann nicht meine eigene Klasse sein, sondern ein Wrapper dafür? Nur wie sorge ich dann dafür, dass der DataContext richtig angezeigt wird? Wie bisher mit DataTemplates? Was für einen DataType bekommen die denn? Den des ViewModels oder den des Models?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

13

16.06.2015, 22:21

Ja das ViewModel dient als eine Art Kapselung zwischen deinen Datenmodellen und der View .... man kann es auch als Wrapper bezeichnen. Dein ViewModel enthält eine Instanz deiner Klassen
als privates Feld und gibt dieses über Properties an die Views weiter. Properties des DataContext einer View (also die Properties des zugehörigen ViewModels) kannst du ganz normal Binden, genauso
wie du das mit Properties machst die du im CodeBehind der Views erzeugst.

Daher musst du auch nix am DataTemplates ändern .... abgesehen davon dass du den DataType der DataTemplates halt auf deine eigenen Klassen setzen musst, aber ich nehme an das hast du eh schon.

MFG

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »QuickAndDirty« (16.06.2015, 22:27)


CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

14

17.06.2015, 15:02

Ich mache mal ein Beispiel, ob ichs verstanden habe:
Mein ViewModel enthält dann also eine ObservableCollection mit Effektobjekten. Die ObservableCollection ist dann die Property des VM? Die Eigenschaften meines Effektobjekts, die von der View (z.B. ListBox?) angezeigt werden sollen, müssen dann doch auch noch INotifyPropertyChanged implementieren, sonst wird ja nichts aktualisiert oder!?

Oder habe ich das falsch verstanden und jeder Effekt bekommt ein ViewModel und die werden dann in eine ObservableCollection gepackt!? Fände ich aber ein wenig sonderbar...
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

15

17.06.2015, 16:47

Ja das ist soweit alles richtig, bis auf die Sache mit dem INotifyPropertyChanged implementieren. Die ObservableCollection ist
eine besondere Version der C# List<> welche selbst die Notwendigen Events triggert wenn sich etwas in ihr ändert (daher wohl observable).

Du bräuchtest also lediglich:

C#-Quelltext

1
2
3
4
5
6
public ObservableCollection<Effect> EffectCollection { get; set;}

public AppViewModel
{
    EffectCollection = new ObservableCollection<Effect>();
}


Wenn du diese ViewModel dann als DataContext einer View setzt, kann du in dieser View an die Source einer ListBox deine EffectCollection binden.

MFG

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

16

17.06.2015, 19:25

Müssen die Objekte, die die ObservableCollection enthält wirklich nicht INotifyPropertyChanged implementieren? Dass die ObservableCollection Events triggert, wenn sich die Objekte in der Liste verschieben oder so, das weiß ich, aber triggert die auch, wenn sich eine Eigenschaft der Objekte ändert, das kann sie ja eigentlich nicht kontrollieren!?

Mit View ist also keine Listbox, sondern das Fenster gemeint, wo die ListBox drin ist? Dann bekommt auch das Fenster mein ViewModel als DataContext?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

17

17.06.2015, 22:44

Müssen die Objekte, die die ObservableCollection enthält wirklich nicht INotifyPropertyChanged implementieren?

Nein müssen sie wirklich nicht, ist auch hier Doku entsprechend dokumentiert. Einfach bis zur Überschrift Hinweise runterscrollen.
Dort steht dann im dritten Abschnitt, dass die ObservableCollection bereits das INotifyPropertyChanged-Interface implementiert und daher selbstständig auf Änderungen von Obejekten in der Liste hinweist.

Mit View ist also keine Listbox, sondern das Fenster gemeint, wo die ListBox drin ist? Dann bekommt auch das Fenster mein ViewModel als DataContext?

Eine ListBox ist ein WPF-Control. Eine View ist normalerweise ein Window oder ein UserControl. Ich selbst nutze immer ein leeres Window in das ich UserControls setze, wobei jedes UserControl eine View darstellt.
Das Window selbsts stellt die höchste Instanz der GUI dar und enthält auch das ApplicationViewModel. Die UserControls sind meist logische zusammenhängender Bestandteile der GUI, wie zum Beispiel,
meherer Buttons oder eine Ansicht mit der eine bestimmter Datentype dargestellt wird (Bei dir zum beispiel EffectView um Effect-Objekte darzustellen und zu bearbeiten).

Da du ja schon DataTemplates erwähnt hast .... du kannst mittels DataTemplates auch festlegen das bestimmte DatenTypen mit einer bestimmten View dargestellt werden. Dies ist meiner Meinung nach eines
der nützlichsten Konstrukte in WPF. Da du so sehr einfach (10-20 Zeilen) eine komplett dynamische Oberfläche erzeugen kannst in der beliebige viele Objekte mit vordefinierten Aussehen dargestellt werden.

MFG

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

18

17.06.2015, 22:49

OK, dann danke ich dir! Ich probiere das jetzt mal aus und wenns noch Probleme gibt, dann melde ich mich. :)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

19

18.06.2015, 00:36

Müssen die Objekte, die die ObservableCollection enthält wirklich nicht INotifyPropertyChanged implementieren?

Nein müssen sie wirklich nicht, ist auch hier Doku entsprechend dokumentiert. Einfach bis zur Überschrift Hinweise runterscrollen.
Dort steht dann im dritten Abschnitt, dass die ObservableCollection bereits das INotifyPropertyChanged-Interface implementiert und daher selbstständig auf Änderungen von Obejekten in der Liste hinweist.

Die Antwort geht an der Frage vorbei. Die ObservableCollection implementiert bereits das Interface, wodurch Änderungen der Liste (Elemente hinzufügen, entfernen o. ä.) überwacht werden können. Damit aber Änderungen innerhalb der Objekte überwacht werden können, müssen diese ebenfalls das Interface implementieren. (Ein einmaliges Auslesen sollte davon nicht beeinflusst sein, sondern wirklich nur das auf Änderungen hin Überwachen.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

20

18.06.2015, 13:06

OK danke Sacaldur, das war die Antwort, die ich erwartet habe! QuickAndDirty was sagst du dazu, wenn du jetzt wahrscheinlich besser weißt, was ich eigentlich wollte. ;)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Werbeanzeige