2013-03-15 25 views
10

爲什麼我們不能發佈沒有任何PayLoad的事件。在Prism EventAggregator中發佈沒有PayLoad事件?

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

現在,我不需要在這裏通過任何工資負擔。但EventAggregator實現要求我有一個空類來做到這一點。

事件:

public class SelectFolderEvent : CompositePresentationEvent<SelectFolderEventCriteria> 
    { 
    } 

有效載荷:

public class SelectFolderEventCriteria 
    { 
    } 

爲什麼棱鏡沒有給出一個辦法只有使用事件併發布類似

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

設計是它與我不明白嗎? 請解釋。謝謝!

+0

難道我的回答幫助? – Marc 2013-04-04 09:17:23

回答

9

好問題,我沒有看到沒有發佈沒有有效載荷的事件的原因。在某些情況下,事件已經發生的事實就是您需要並希望處理的所有信息。

有兩種選擇:因爲它是開源的,你可以使用Prism源代碼並提取一個不帶有負載的CompositePresentation事件。

我不會這麼做,但是將棱鏡當作第三方庫處理,並保持原樣。爲第三方庫編寫Facade以適合您的項目是一種很好的做法,在這種情況下爲CompositePresentationEvent。這可能看起來像這樣:

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); 
    } 
} 

如果有什麼不清楚的地方,請詢問。

+1

偉大的解決方案,我認爲你只需要從EventBase繼承,以使其工作財產 - 雖然這裏推薦:https://compositewpf.codeplex.com/discussions/69113 – openshac 2014-01-22 14:01:51

+0

真的,謝謝!如果你在依賴注入中使用它,你可能不需要繼承,但這不是問題。 – Marc 2015-01-02 20:20:00

2

只是爲了更新這個問題,因爲這個問題被問到/回答了,至於棱鏡6.2,現在Prism PubSubEvents支持空的有效載荷。

如果您使用的是舊版本,這個博客顯示瞭如何創建一個「空」的類,它清楚地表明瞭有效載荷的意圖:https://blog.davidpadbury.com/2010/01/01/empty-type-parameters/

相關問題