2016-12-15 2 views
0

Ich versuche, einige Regionen zu erstellen, und in einem dieser Regionen, ich habe Button "Login" und ICommand Login Eigenschaft, an die es gebunden ist. Also ich möchte diese Login von Shell abonnieren.Prism ICommand von Region zu Shell

Ich versuchte PubSubEvent, aber ich brauche auch CanExecute Methode.

Eine andere Lösung, die ich gefunden habe, ist statische Klasse mit statischen Befehlen zu verwenden. Das halte ich für kein gutes Muster.

Wie kann man das aus der Perspektive des Musters tun?

EDIT 1

einen Bereich zuzuweisen, rufe ich dies in constractor Sicht Modell Shell:

regionManager.RegisterViewWithRegion("MainContent", typeof(LoginArea)); 

Und angesichts verwende ich diese ViewModelLocator.AutoWireViewModel="True", so konnte ich meine Shell Sicht nicht injizieren Modell, um Ereignisse zu abonnieren.

Antwort

1

Sie könnten zwischen verschiedenen Modulen auf entkoppelte Weise mithilfe des Ereignisaggregators kommunizieren. Es gibt ein Beispiel auf GitHub hier: https://github.com/PrismLibrary/Prism-Samples-Wpf/blob/master/EventAggregation/Desktop/ModuleA/AddFundPresenter.cs. Wenn Sie die Grundlagen des Ereignisaggregatormusters und dessen Anwendung in Prism möchten, können Sie den folgenden Blogpost verwenden: https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/.

Die andere Option besteht darin, einen gemeinsam genutzten Dienst zu verwenden: https://social.msdn.microsoft.com/Forums/en-US/22907a0f-d805-4195-8272-7c284b72d2ee/example-of-using-shared-services-prism?forum=wpf. Ein gemeinsam genutzter Dienst ist einfach eine Klasse, die entkoppelten Funktionen für mehrere Module bereitstellt. Es sollte eine Schnittstelle implementieren und Sie registrieren es mit Container in Ihrem Bootstrapper, in der Regel als ein Singleton.

Und in Sicht ich benutze diese ViewModelLocator.AutoWireViewModel = "True", so konnte ich nicht mein Shell-Ansichtsmodell, um Ereignisse zu abonnieren.

Nun, wenn Sie die Shell der View-Modell mit irgendwelchen Abhängigkeiten überhaupt injiziert wird nicht wollen, werden Sie irgendeine Art von statischer Klasse verwenden, um einen Verweis auf die Eventaggregator oder Shared-Service zu bekommen. Es ist ein Beispiel dafür, wie Sie den Eventaggregator von einer statischen Klasse hier aussetzen könnten: https://rachel53461.wordpress.com/2011/10/09/simplifying-prisms-eventaggregator/

Aber man konnte die Shell-Fenster mit leicht injizieren, was auch immer Abhängigkeiten Sie müssen durch den InitializeShell zwingenden() -Methode Ihren Bootstrapper, zB:

ViewModelLocator.AutoWireViewModel - No DataContext for MainWindow

Aber sprechen von pa: sowieso für Usercontrol Ansichten verwendet werden

class Bootstrapper : UnityBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     return Container.Resolve<MainWindow>(); 
    } 

    protected override void InitializeShell() 
    { 
     RegisterTypeIfMissing(typeof(IEventAggregator), typeof(EventAggregator), true); 
     Application.Current.MainWindow.DataContext = new MainWindowViewModel(Container.Resolve<IEventAggregator>()); 
     Application.Current.MainWindow.Show(); 
    } 
} 

Die ViewModelLocator.AutoWireViewModel Eigenschaft ist gemeint, Denken Sie darüber nach, Ihre Shell-View-Modellklasse in ein Modul zu verschieben und das Shell-Fenster als eine echte Shell zu betrachten, die aus untergeordneten Ansichten besteht.