2013-03-15 72 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/