IEventAggregator没有覆盖模块

Vac*_*ano 1 c# wpf prism unity-container eventaggregator

我试图让我的IEventAggregator允许我在一个模块中发布和事件,并在另一个模块中捕获它.我在单个模块/项目中尝试了下面的代码,效果很好.它只在我有一个模块/项目发布事件而另一个订阅它时失败.

我已经通过统一将我的IEventAggregator注入到两个模块中.

我有3个项目,其中两个有模块(称为A和B),一个只是一个普通的类库(称之为接口)

在类库接口中有以下代码:

public class RandomTestEvent : CompositePresentationEvent<string>
{
}
Run Code Online (Sandbox Code Playgroud)

在模块A中,按钮单击命令中存在此代码(这实际上在项目中的视图模型中):

var evt2 = _eventAggregator.GetEvent<RandomTestEvent>();
evt2.Publish("Testing");
Run Code Online (Sandbox Code Playgroud)

在模块B中有以下代码:

    public void Initialize()
    {
        var evt2 = _eventAggregator.GetEvent<RandomTestEvent>();
        evt2.Subscribe(OnRandomThingDone);
    }

    private void OnRandomThingDone(string obj)
    {
        MessageBox.Show("Random Event Done With: " + obj);            
    }
Run Code Online (Sandbox Code Playgroud)

我可以追踪,我看到订阅被调用.当我看到Publish geting时调用者说Subscriptions = 1(因此它知道订阅已经完成,所以我似乎没有2个不同的IEventAggregator实例.)

但OnRandomThingDone永远不会在发布后调用.

任何想法为什么?(我需要发布更多代码吗?如果有,请告诉我.)

Jef*_*eff 7

实际上随机猜测 - 您的订阅者在事件发布之前获得了GC'd - 因为Prism的CompositePresentationEvent的默认行为是使用WeakReferences来保留订阅者目标引用.

所以...尝试调用Subscribe重载,它允许你指定keepSubscriberReferenceAlive并传入true.

如果您的订阅者成功收到该事件,则表示您的包含OnRandomThingDone的类超出范围并在事件发布之前获取GC.

随机API参考:http: //msdn.microsoft.com/en-us/library/ff921122 (PandP.20).aspx