Laden...

Verschachtelte ViewModels (für Windows Forms)

Erstellt von emral86 vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.422 Views
E
emral86 Themenstarter:in
59 Beiträge seit 2009
vor 13 Jahren
Verschachtelte ViewModels (für Windows Forms)

Hallo zusammen,

hab zunächst einmal lange im Internet versucht mich über dieses Thema schlau zu machen.. Leider nicht so ganz erfolgreich..

Es geht um folgendes:

Ich habe eine ViewModel welches wiederum ein anderes ViewModel nennen wir es mal "SubViewModel" beinhaltet. Was ist die beste Lösung um zu erfahren dass sich im SubViewModel etwas geändert hat ohne dass ich das SubViewModel ergänzen muss um von dem PropertyChanged Ereignis benachrichtigt werde...
Und zweitens will ich etwas mein ViewModel einem Control zuweisen nachdem sich alle Eigeschaften des SubViewModels geändert haben?

Momentan habe ich es so realisiert dass ich ein leeres PropertyChanged event ausführe und auf control seite auf dieses warte!

Ich weiß aber nicht wirklich ob dass die beste Lösung ist.. ich hoffe ihr könnt mir da weiterhelfen..

P.S. Ich arbeite ausschliesslich mit C# Code also ohne XAML.

Grüße,
emral

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo emral86,

du kannst ViewModels in ViewModels schachten, das ist absolut kein Problem. Was du wissen musst, ist das es mehrere Möglichkeiten gibt, ein ViewModel darzustellen. Der einfachste Weg wäre dafür ein DataTemplate zu schreiben. Hier findest du einen sehr guten Einstieg in das MVVM-Pattern. Dort sind auch alle Möglichkeiten übersichtlich aufgelistet.

Du sagtest, dass du nur in C# programmierst. Du bist gewissermaßen gezwungen, in XAML zu programmieren! Ich verstehe deine Aussage nicht. Kannst du näher drauf eingehen?

Das PropertyChanged-Event implementiert du nicht direkt in einem ViewModel, sondern in einer Basisklasse. Es ist doch unsinnig, wenn du für jedes ViewModel von INotifyPropertyChanged implementierst und immer den Handler programmierst. Dies ist unter anderem auch in dem Artikel sehr gut beschrieben(s. oben).

Mehr oder weniger ist MVVM keine Richtline, sondern ein Pattern, also im Sinne von "du kannst es so oder auch so machen". Das Pattern ist sehr flexibel, es gibt also keinen "richtigen" Weg. Es mag mehrere Wege geben. Welchen du nimmst, bleibt dir überlassen.

zero_x

E
emral86 Themenstarter:in
59 Beiträge seit 2009
vor 13 Jahren

Hallo zero_x,

zunächst einmal vielen lieben dank für deine ausführliche antwort.

Eben merk ich dass meine Frage doch eher in den WinForms bereich reingehört, da ich das MVVM Pattern für diese umsetzen wollte. Von daher kommt XAML auh nicht in frage..
Das macht dann für mich die Sache dementsprechend schwieriger..

emral

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo emral86,

WinForms und MVVM passt nicht zusammen! MVC wäre eine Alternative.

zero_x

E
emral86 Themenstarter:in
59 Beiträge seit 2009
vor 13 Jahren

Warum sollte es denn nicht passen MVVM ist doch auch nur ein Design Pattern oder nicht!?

F
10.010 Beiträge seit 2004
vor 13 Jahren

Klar kann man unter WF auch MVVM machen, es ist aber nicht sehr verbreitet.

Aber wenn du mitbekommen möchtest, wenn sich ein Property ändert, muss das Model INotifyPropertyChanged implementieren.
Wenn du die Klasse nicht anpassen willst/kannst, benutze eine Facade oder einen Proxy.

E
emral86 Themenstarter:in
59 Beiträge seit 2009
vor 13 Jahren

Hallo FZelle,

danke für deine Antwort. Natürlich weiß ich, dass ich das INotifyPropertyChanged implementieren muss.. Es geht hauptsächlich darum wie ich mitbekomme wenn sich alle Eigenschaften meines ViewModels geändert haben..

Also nochmal:

Mein ViewModel besitzt ein SubViewModel. Wenn sich im SubViewModel die properties ändern danngibt es ein PropertyChanged mit "SubViewModel/Propertyname" jedoch wie benachrichtigen wenn sich das SubViewModel im ganzen geändert hat wie soll ich am besten das ViewModel davon benachrichtigen??

Gruß emral

P
660 Beiträge seit 2008
vor 13 Jahren

Mein ViewModel besitzt ein SubViewModel. Wenn sich im SubViewModel die properties ändern danngibt es ein PropertyChanged mit "SubViewModel/Propertyname" jedoch wie benachrichtigen wenn sich das SubViewModel im ganzen geändert hat wie soll ich am besten das ViewModel davon benachrichtigen??

Wieso sollte es die BasisKlasse sich darum kümmern wenn sich im Child etwas ändert?
davon sollte eigentlich nur die weiteren Klassen drunter etwas mitbekommen oder die
View welches das VM benutzt. In dieser BasisKlasse solltest du auch nur das gerüst
ALLER deiner ViewModels haben

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

E
emral86 Themenstarter:in
59 Beiträge seit 2009
vor 13 Jahren

Was ich erreichen will ist, dass wenn sich das SubViewModel geändert hat (private setter) eine Benachrichtigung an die View damit die View mit den Daten aus dem SubViewModel zeichnen kann.
Und da die View mehrere SubViewModels besitzt und sich an die PropertyChanged des Basis ViewModels hängt, brauch ich eine Benachrichtigung das sich das SubViewModel geändert hat undzwar nicht das sich die einzelnen Properties geändert haben sondern das ganze ViewModel.

5.658 Beiträge seit 2006
vor 13 Jahren

Dann würde es reichen, wenn das Parent-Objekt das NotifyPropertyChanged-Ereignis des Unterobjektes abonniert, um das eigene NotifyPropertyChanged-Ereignis auszulösen.

Weeks of programming can save you hours of planning

E
emral86 Themenstarter:in
59 Beiträge seit 2009
vor 13 Jahren

Hmmm......
Wenn ich doch meine ViewModels in einem Control Fülle und bei jeder Property die gefüllt wird ein NotifyPropertyChanged geschmissen wird möchte ich darüber gar nicht informiert werden sondern erst dann wenn sich alle Properties geändert haben!?

Ich habe dafür folgendes gemacht => Nach dem alle Properties gefüllt worden sind führe ich eine Methode aus die innerhalb des ViewModels eine leere PropertyChanged schmeisst. Somit weiß ich dass alle Daten geändert wurden und ich zeichnen kann.
Nur weiß ich nicht ob das der richtige Weg ist!?

F
10.010 Beiträge seit 2004
vor 13 Jahren

Ich denke du gehst da von der falschen Seite ran.

Das sieht mir eher so aus, als wenn du Einfgabevalidierungen machen willst,
das solltest du nicht über INotifyPropertyChanged sondern eher über IDataErrorInfo machen.

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

MVVM ist nicht möglich in Windows Forms (sonst hätte es sich genauso schnell rausgebildet wie bei WPF und es würde das schon seit Jahren geben). Der Hauptgrund ist einfach das in Windows Forms keine passiven Views wie in WPF möglich sind. Der Databindingsupport von Windows Forms ist lange nicht so ausgeprägt wie in WPF und vor allem gibt es keine Commands und damit keine Möglichkeit die UI komplett durch Bindings zu entkoppeln. Man muss auf Events der GUI reagieren und daraufhin Aktionen im Logiklayer auslösen. Und genauso muss aus der Logik heraus wieder die GUI verändert werden und das geht aufgrund des nicht so ausgeprägtem DataBindings nicht so gut. Daher brauch man um Logik und UI zu trennen eine Art Controller der genau die Kommunikation zwischen Logik und UI macht und schon ist man wieder bei MVC statt MVVM. MVC ist ein bewährtes Pattern und in Windows Forms auch üblich. Daraus wurde ja dann auch MVVM in WPF abgeleitet. Aber MVVM so wie es üblich verstanden wird, ist nicht möglich in Windows Forms.

Wie willst du denn die Trennung zwischen View und ViewModel machen in Windows Forms wenn du MVVM machen willst?

Wenn ich doch meine ViewModels in einem Control Fülle und bei jeder Property die gefüllt wird ein NotifyPropertyChanged geschmissen wird möchte ich darüber gar nicht informiert werden sondern erst dann wenn sich alle Properties geändert haben!? Dann implementiere IEditableObject und lös erst beim Editierende das PropertyChanged aus.

Baka wa shinanakya naoranai.

Mein XING Profil.