2016-11-20 5 views
1

Ich habe 3 ViewModels, sagen wir ViewModelA, ViewModelB und ViewModelC. Jedes Ansichtsmodell hat eine entsprechende Ansicht.MVVM Shared Events

In ViewModelA habe ich ein öffentliches Ereignis, das ich verwende einige Informationen senden.

Ich möchte, dass ViewModelB und ViewModelC dieses Ereignis in der aktuellen/laufenden Instanz von ViewModelA abonnieren?

Wie kann ich das tun? Wenn ein neues ein ViewModelA Ich habe eine andere Instanz von ViewModelA, so brauche ich einen Verweis auf die aktuelle ViewModelA ...

Hinweis: Ich verwende MVVM Light oder nay anderen Framework (noch) nicht, weil ich habe sie noch nicht gelernt :) Danke.

Antwort

1

Wenn Sie neue Ansichten aus der Sicht der ViewModelA erstellen Sie den Verweis auf eine andere Ansicht wie diese

var viewModelA = DataContext as ViewModelA; 
var newWindow = new ViewB(viewModelA); 

Dann würden Sie eine Eigenschaft in Ihrem ViewModelB haben müssen

public ViewModelA MyViewModelA { get; set; } 

passieren kann Und in Ihrer neuen Ansicht:

public ViewB(ViewModelA viewModelA) 
{ 
    InitializeComponents(); 
    var viewModelB = DataContext as ViewModelB; 
    viewModelB.MyViewModelA = viewModelA; 
} 

Und dann können Sie über MyV auf Ihr ViewModelA zugreifen iewModelA.

Ich habe es immer so gemacht und bisher keine Probleme gesehen.

+0

Vielen Dank, aber ich möchte Code hinter diesem vermeiden, ich MEF zu importieren/exportieren mein MainViewModel DataContext, und ich verwende ViewModelLocator von WPF DataTemplates, um DataContext/Views aufzulösen. Trotzdem danke. –

1

1) Sie können eine Art von einfachen Publisher/Subscriber wie diese auf codeproject implementieren. Sie werden immer einen Schritt voraus sein, weil die meisten Frameworks hat etwas Ähnliches:

In MVVM anzünden Messenger genannt wird:

es EventAggregator

ist

In Prism

2) hässliche Lösung statisches Ereignis zu schaffen wäre in ViewModelA, auf diese Weise brauchen Sie keine Referenz

+0

Ich erstelle eine separate statische Klasse für meine öffentlichen Events, wo andere Viewmodels ihre Events abonnieren/veröffentlichen können, aber ich werde versuchen, den mjay 3rd link suggestion ... Danke –

1

Während Sie Referenzen zwischen ViewModels übergeben können, macht es Ihre App eng gekoppelt und nicht besonders skalierbar. Auch wenn Sie sich für eine Änderung in der Zukunft entscheiden, wächst die Menge an Refactoring schnell und macht die Verwaltung von Änderungen schwieriger.

Werfen Sie einen Blick auf ein PubSub Event-Framework. Diese sind alle in von Ihnen genannten MVVM-Frameworks wie PRISM oder MVVM-Light enthalten, Sie können jedoch immer Ihre eigene Version hinzufügen, wenn Sie die oben genannten vollständigen Frameworks nicht benötigen oder benötigen.

Werfen Sie einen Blick auf here für eine einfache No Nonsense-Implementierung, die Sie in der Lage sein sollten, an Ihre eigenen Anforderungen anzupassen.

+0

Hum ...Während dieses Prozesses erstelle ich eine getrennte statische Klasse, um die öffentlichen Ereignisse zu deklarieren, und jede Klasse kann sie abonnieren und arbeiten ... Jetzt sehen Sie die dritte Option aus Ihren Vorschlägen, ich mag sie wirklich, werde ich geben Versuchen Sie es mal ... Danke. –