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

标签 mvvm prism silverlight-5.0

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

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

现在,我不需要在这里传递任何有效载荷。但是 EventAggregator 实现要求我有一个空类来做到这一点。

事件:
  public class SelectFolderEvent : CompositePresentationEvent<SelectFolderEventCriteria>
  {
  }

有效载荷:
  public class SelectFolderEventCriteria
  {
  }

为什么 Prism 没有给出只使用 Event 并像这样发布它的方法
    _eventAggregator.GetEvent<SelectFolderEvent>().Publish();

是设计使然,我不明白吗?
请解释。谢谢!

最佳答案

好问题,我没有看到不发布没有有效负载的事件的理由。在某些情况下,已引发事件的事实就是您需要和想要处理的所有信息。

有两种选择: 因为它是开源的,所以您可以使用 Prism 源并提取一个不需要负载的 CompositePresentation 事件。

我不会那样做,而是将 Prism 作为 3rd 方库处理并保持原样。写一个 Facade 是个好习惯让第 3 方库适合您的项目,在本例中为 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);
    }
}

如果有什么不清楚的,请追问。

关于mvvm - 在 Prism EventAggregator 中发布没有 PayLoad 的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15430059/

相关文章:

wpf - 运行目录的所有模块( Prism )

c# - Silverlight - 第一次进入全屏在后台打开(FF,Chrome,不是 IE)

c# - 如何从 Dot net 库调用 SL OOB 应用程序中的方法,反之亦然?

design-patterns - 使用MVVM时,是否应该创建新的 View 模型以不同方式显示同一模型?

wpf - ListBox SelectedItem 绑定(bind)损坏

c# - 更新 ObservableCollection 列表时出现未处理的异常

javascript - 带键盘输入的全屏 Silverlight

c# - 如何将 ListView 按钮的绑定(bind)上下文设置为 Xamarin Forms 中父级的绑定(bind)上下文

c# - 在 wpf 中绑定(bind)列表框并刷新数据

c# - 从语言文件绑定(bind)动态值的正确方法是什么?