wpf – 如何使用EventAggregator和Microsoft Prism库从订阅方法返回数据

我正在使用MVVM和Microsoft Prism库来开发 WPF项目.所以,当我需要通过类进行通信时,我使用类Microsoft.Practices.Prism.MefExtensions.Events.MefEventAggregator,我发布事件和订阅方法如下:

要发布:

myEventAggregator.GetEvent< MyEvent>()出版(myParams)

认购:

myEventAggregator.GetEvent< MyEvent>()订阅(MySubscribedMethod).

但我的问题是:有没有办法在发布事件后从“订阅方法”返回一些数据?

解决方法

据我所知,如果所有事件订阅者都使用ThreadOption.PublisherThread选项(这也是认选项),则事件是同步执行的,订阅者可以修改EventArgs对象,因此您可以在发布者中使用

myEventAggregator.GetEvent<MyEvent>().Publish(myParams)
if (myParams.MyProperty)
{
   // Do something
}

订阅代码如下所示:

// Either of these is fine.
myEventAggregator.GetEvent<MyEvent>().Subscribe(MySubscribedMethod)
myEventAggregator.GetEvent<MyEvent>().Subscribe(MySubscribedMethod,ThreadOption.PublisherThread)

private void MySubscribedMethod(MyEventArgs e)
{
    // Modify event args
    e.MyProperty = true;
}

如果您知道应始终同步调用该事件,则可以为事件创建自己的基类(而不是CompositePresentationEvent< T>),它会覆盖Subscribe方法,并且只允许订阅者使用ThreadOption.PublisherThread选项.它看起来像这样:

public class SynchronousEvent<TPayload> : CompositePresentationEvent<TPayload>
{
    public override SubscriptionToken Subscribe(Action<TPayload> action,ThreadOption threadOption,bool keepSubscriberReferenceAlive,Predicate<TPayload> filter)
    {
        // Don't allow subscribers to use any option other than the PublisherThread option.
        if (threadOption != ThreadOption.PublisherThread)
        {
            throw new InvalidOperationException();
        }

        // Perform the subscription.
        return base.Subscribe(action,threadOption,keepSubscriberReferenceAlive,filter);
    }
}

然后,您不是从CompositePresentationEvent派生MyEvent,而是从SynchronousEvent派生它,它将保证您将同步调用该事件,并且您将获得修改后的EventArgs.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...