在Prism EventAggregator中发布没有PayLoad的事件?

时间:2013-03-15 10:32:25

标签: mvvm prism silverlight-5.0

为什么我们不能在没有任何PayLoad的情况下发布活动。

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

现在,我不需要在这里传递任何工资。但EventAggregator实现要求我有一个空类来执行此操作。

事件:

  public class SelectFolderEvent : CompositePresentationEvent<SelectFolderEventCriteria>
  {
  }

有效载荷:

  public class SelectFolderEventCriteria
  {
  }

为什么Prism没有办法只使用事件并像

那样发布它
    _eventAggregator.GetEvent<SelectFolderEvent>().Publish();

是否按设计而我不明白? 请解释。谢谢!

2 个答案:

答案 0 :(得分:9)

好问题,我没有看到没有有效载荷的情况下不发布活动的原因。在某些情况下,事件已被提出的事实是您需要和想要处理的所有信息。

有两个选项:由于它是开源的,您可以使用Prism源并提取不带有效负载的CompositePresentation事件。

我不会这样做,而是将Prism作为第三方库处理并保持原样。优良作法是为第三方库编写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 :(得分:2)

为了更新这个问题,因为这个问题被提出/回答,从Prism 6.2开始,Prism PubSubEvents现在支持空的有效载荷。

如果您使用的是旧版本,此博客会介绍如何创建一个“清空”类,清楚地表明有效负载的意图:https://blog.davidpadbury.com/2010/01/01/empty-type-parameters/