12

PayLoadなしでイベントを公開できないのはなぜですか。

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

さて、ここで支払う必要はありません。しかし、EventAggregatorの実装では、それを行うために空のクラスを用意する必要があります。

イベント:

  public class SelectFolderEvent : CompositePresentationEvent<SelectFolderEventCriteria>
  {
  }

ペイロード:

  public class SelectFolderEventCriteria
  {
  }

Prismがイベントだけを使用して次のように公開する方法を提供していないのはなぜですか

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

設計によるもので、わかりませんか?説明してください。ありがとう!

4

2 に答える 2

11

良い質問です。ペイロードなしでイベントを公開しない理由はわかりません。イベントが発生したという事実が、あなたが必要とし、処理したいすべての情報である場合があります。

2つのオプションがあります。オープンソースであるため、Prismソースを取得し、ペイロードを取得しないCompositePresentationイベントを抽出できます。

私はそうはしませんが、Prismをサードパーティのライブラリとして扱い、そのままにしておきます。プロジェクトに適合するようにサードパーティライブラリのファサードを作成することをお勧めします。この場合は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);
    }
}

不明な点がございましたら、お問い合わせください。

于 2013-03-15T11:35:13.200 に答える
2

この質問が尋ねられた/回答されてからの状況を更新するために、Prism 6.2以降、空のペイロードがPrismPubSubEventsでサポートされるようになりました。

古いバージョンを使用している場合、このブログは、ペイロードの意図を明確に示す「Empty」クラスを作成する方法を示しています:https ://blog.davidpadbury.com/2010/01/01/empty-type-parameters //

于 2016-10-10T16:28:51.170 に答える