| 

.NET C# Java Javascript Exception

1
Hallo :-D

ich habe ein MainWindow mit einem dazugehörigen ViewModel.
Auf dem MainWindow befindet sich ein UserControl mit einem Button. Das UserControl
hat selbst natürlich auch ein ViewModel.

Der Button ist an ein ActionCommand im ViewModel des UserControl gebunden.

Wie gehe ich aber vor, wenn ich den Klick des Buttons im MainWindow behandeln möchte?

Liebe Grüße :-D

Silvia
10.07.2012
Silvia1963 320 2 7
2 Antworten
0
Auch wenn das jetzt vielleicht nach einem Holzhammer klingt: Um das direkte Event zu vermeiden, durch welches eine direkte Abhängigkeit der ViewModel vom Hauptfenster und des UserControls entsteht, bietet sich ein EventAggregator an.

In deinem Fall würde das UserControl über sein Command also feststellen, dass der Button geklickt wurde und dann den EventAggregator aufrufen um darüber die Nachricht zu verbreiten. Nun besteht keine direkte Abhängigkeit zwischen den Views mehr und du kannst dieses Event auch von anderen Stellen in der Applikation abonieren.

Beispiel: Du hast einen Button zum Ausloggen des aktuellen Nutzers. In seinem Command wird ein LogoutEvent gefeuert. Dieses Event wird über den Aggregator an die UI geleitet welche darauf hin ein LogIn Fenster anzeigt. Gleichzeit merkt der Statushandlder der Applikation, dass die aktuellen Einstellungen des Nutzers gespeichert werden müssen. Außerdem können offene Verbindungen zu Webservices oder Datenbanken geschlossen werden und das alles ohne das all diese Bestandteile dein UserControl mit dem Logout Button "kennen" müssen.

Im MVVM Light Toolkit müsste sowas drin sein. Bei Prism ist es auf alle Fälle drin aber nur wegen dem EventAggregator würde ich mir das Framework nicht rein laden.

Nachtrag:
Mir ist gerade noch ein Vorteil des EventBrokers eingefallen. Normale Events haben das Problem, dass sie theoretisch wieder abgemeldet werden müssen. Tut man dies nicht, was häufig passiert weil die Leute sich dessen nicht bewusst sind, ergibt sich ein Speicherleck da die Instanz die das Event aboniert weiterhin eine Referenz auf das Objekt hält.

Alle mir bekannten Implementierungen des EventBrokers verwenden hingegen WeakReferences. Dadurch wird die Referenz abgestoßen sobald der Eventbroker der einzige ist, der noch eine hält. Es kommt also nicht zu einem Speicherleck.
11.07.2012
Hendrik Lösch 1,5k 9
0
Verstehe ich das richtig?

Du hast ein View (MainWindow) und ein ViewModel. Und Du hast den Button über einen Command an das ViewModel gebunden, d.h. Du kannst im ViewModel Code ausführen, wenn der Button angeklickt wird.

Das gefällt Dir aber nicht und Du willst stattdessen lieber Code im View ausführen?
Warum? Und was hindert Dich daran, einfach das Click-Event zu benutzen?

Oder willst Du BEIDES? Click-Event UND Command im ViewModel? Musst Du versuchen ob beides zusammen geht. Ich würde mich aber an der Stelle fragen, warum du das möchtest.

Oder verstehe ich Dich komplett falsch?

Edit: Nochmal nachgelesen. Lass Dein User-Control einen Event abfeuern, wenn der Button geklickt wird d.h. wenn der Command ausgeführt wird. Oder über das ViewModel des UserControls. Dann kann Dein MainWindow oder auch dessen ViewModel darauf reagieren.
10.07.2012
Jens Duczmal 2,6k 3 9
Hallo Jens,
Danke für Deine Antort. Ich werde das mit dem Event mal probieren :-)
Silvia1963 11.07.2012

Stelle deine Mvvm-Frage jetzt!