2013-03-15 14 views
10

Dlaczego nie możemy publikować wydarzeń bez płatności w systemie PayLoad.Opublikuj wydarzenie bez PayLoad w Prism EventAggregator?

_eventAggregator.GetEvent<SelectFolderEvent>().Publish(new SelectFolderEventCriteria() { }); 

Teraz nie potrzebuję tu żadnego dodatkowego obciążenia. Ale implementacja EventAggregator upoważnia mnie do tego, aby mieć pustą klasę.

zdarzenia:

public class SelectFolderEvent : CompositePresentationEvent<SelectFolderEventCriteria> 
    { 
    } 

ładunku:

public class SelectFolderEventCriteria 
    { 
    } 

Dlaczego Prism nie podano sposób na wykorzystanie tylko imprezy i opublikować go jak

_eventAggregator.GetEvent<SelectFolderEvent>().Publish(); 

Czy to jest zgodne z projektem i Nie rozumiem tego? Proszę wyjaśnić. Dzięki!

+0

Czy moja odpowiedź pomoc? – Marc

Odpowiedz

9

Dobre pytanie, nie widzę powodu, dla którego nie publikuje zdarzenie bez ładunku. Są przypadki, w których fakt, że wydarzenie zostało podniesione, to wszystkie informacje, których potrzebujesz i chcesz sobie poradzić.

Istnieją dwie opcje: Jak to jest open source, można wziąć źródło Prism i wyodrębnić zdarzenia CompositePresentation że nie bierze ładunek.

nie będę robić, ale obsługiwać Prism jako 3rd biblioteki partii i pozostawić tak jak jest. Dobrą praktyką jest napisanie Facade dla biblioteki innej firmy, aby pasowała do twojego projektu, w tym przypadku dla CompositePresentationEvent. Może to wyglądać mniej więcej tak:

public class EmptyPresentationEvent : EventBase 
{ 
    /// <summary> 
    /// Event which facade is for 
    /// </summary> 
    private readonly CompositePresentationEvent<object> _innerEvent; 

    /// <summary> 
    /// Dictionary which maps parameterless actions to wrapped 
    /// actions which take the ignored parameter 
    /// </summary> 
    private readonly Dictionary<Action, Action<object>> _subscriberActions; 

    public EmptyPresentationEvent() 
    { 
     _innerEvent = new CompositePresentationEvent<object>(); 
     _subscriberActions = new Dictionary<Action, Action<object>>(); 
    } 

    public void Publish() 
    { 
     _innerEvent.Publish(null); 
    } 

    public void Subscribe(Action action) 
    { 
     Action<object> wrappedAction = o => action(); 
     _subscriberActions.Add(action, wrappedAction); 
     _innerEvent.Subscribe(wrappedAction); 
    } 

    public void Unsubscribe(Action action) 
    { 
     if (!_subscriberActions.ContainsKey(action)) return; 
     var wrappedActionToUnsubscribe = _subscriberActions[action]; 
     _innerEvent.Unsubscribe(wrappedActionToUnsubscribe); 
     _subscriberActions.Remove(action); 
    } 
} 

Jeśli coś jest niejasne, zapytaj.

+1

Świetne rozwiązanie, myślę, że po prostu trzeba dziedziczą EventBase aby to działa propertly choć - jak tutaj zalecane: https://compositewpf.codeplex.com/discussions/69113 – openshac

+0

prawda, dziękuję! Jeśli użyjesz go z wtryskiem zależności, możesz nie potrzebować dziedziczenia, ale to nie było tutaj pytanie ... – Marc

2

Wystarczy zaktualizować sytuację, ponieważ kwestia ta został poproszony/odpowiedział jak z Prism 6.2, puste ładunki są teraz obsługiwane w Prism PubSubEvents.

Jeśli korzystasz ze starszej wersji, ten blog pokazuje, jak utworzyć klasę „pusta”, który jasno wskazuje intencji ładowności: https://blog.davidpadbury.com/2010/01/01/empty-type-parameters/

Powiązane problemy