2016-06-21 6 views
1

In My LoginModule in einer Ansicht Modell Ich bin Dispatching ein Ereignis:Anmeldung zu einer Veranstaltung in einem anderen Modul in Prism

void LoginUpdate(object sender, EventArgs e) 
{ 
    _eventAggregator.GetEvent<LoginStatusEvent>().Publish(_status); 
} 

Im EventModule:

public class LoginStatusEvent : PubSubEvent<LoginStatus> 
{ 
} 

Dann ist ich versuchen, es in einem anderen Modul zu abonnieren:

public class EventModule : IModule 
{ 
    IRegionManager _regionManager; 
    IEventAggregator _eventAggregator; 
    private SubscriptionToken subscriptionToken; 
    private bool isLoggedIn { get; set; } 

    public EventModule(IEventAggregator eventAggregator, IRegionManager regionManager) 
    { 
     _regionManager = regionManager; 
     _eventAggregator = eventAggregator; 

     LoginEventsListener(); 
    } 

    public void Initialize() 
    { 

    } 

    public void LoginEventsListener() 
    { 
     LoginStatusEvent loginStatusEvent = _eventAggregator.GetEvent<LoginStatusEvent>(); 

     if (subscriptionToken != null) 
     { 
      loginStatusEvent.Unsubscribe(subscriptionToken); 
     } 

     subscriptionToken = loginStatusEvent.Subscribe(LoginStatusEventHandler, ThreadOption.UIThread, false); 
    } 

    public void LoginStatusEventHandler(LoginStatus loginStatus) 
    { 
     Trace.WriteLine(">> Got it!!"); 

    } 

} 

jedoch die LoginStatusEventHandler wird nie gefeuert und ich bekomme keine Fehler.

+0

Wo definieren Sie die Veranstaltung? Sowohl Publisher als auch Abonnent müssen den gleichen Typ referenzieren. – Haukinger

+0

Das Ereignis wird im 'EventModule' definiert, im' LoginModule' abgefeuert und ich versuche, es im 'EventModule' zu ​​abonnieren – keeg

+0

Hat es mit der 'True'-Flagge in' Subscribe'-Methode funktioniert? – galakt

Antwort

1

OP nicht Subscriber Reference zu halten, wenn für Ereignis zu abonnieren, so in einem Moment Klasse hatte keine Referenzen überhaupt und durch GC gesammelt.

Also in diesem Fall wird es mit True Flag in Subscribe Methode arbeiten.

Als @Haukinger Recht bemerkt:

In Prism Dokumentation https://github.com/PrismLibrary/Prism/blob/ef1a2266905a4aa3e7087955e9f7b5a7d71972fb/Documentation/WPF/30-ModularApplicationDevelopment.md#initializing-modules

Module instance lifetime is short-lived by default. After the Initialize method is called during the loading process, the reference to the module instance is released. If you do not establish a strong reference chain to the module instance, it will be garbage collected. This behavior may be problematic to debug if you subscribe to events that hold a weak reference to your module, because your module just "disappears" when the garbage collector runs.

+1

Als OP sagte "setze es als eine Antwort und ich werde akzeptieren", meinte er, formuliere diesen Kommentar in eine richtige Antwort. Dies ist immer noch ein Kommentar. Sie sollten, warum das funktioniert ... –

+0

@CallumLinington Sie sind wahr – galakt

+2

Sie können dies aus Prism-Dokumentation 'Hinweis: Modul-Instanz Lebensdauer ist standardmäßig kurzlebig. Nachdem die Initialize-Methode während des Ladevorgangs aufgerufen wurde, wird der Verweis auf die Modulinstanz freigegeben. Wenn Sie keine starke Referenzkette für die Modulinstanz erstellen, wird diese unbemerkt gesammelt. Dieses Verhalten kann beim Debuggen problematisch sein, wenn Sie Ereignisse abonnieren, die einen schwachen Verweis auf Ihr Modul enthalten, da Ihr Modul bei der Ausführung des Garbage Collector einfach "verschwindet", da das Abonnement-Token das Abonnement am Leben erhält. – Haukinger

Verwandte Themen