抱歉,如果这是一个非常愚蠢的问题,但是我才刚开始使用caliburn.micro,并且我在努力获取eventAggregator,似乎没有订阅...

我不确定问题出在视图模型还是引导程序。这是视图模型:

class MainWindowViewModel : Screen
{
    private readonly IEventAggregator _eventAggregator;

    public MainWindowViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.Subscribe(this);
    }

    public void SayHello()
    {
        _eventAggregator.Publish("Hello World!");
    }

    public void Handle(string message)
    {
        MessageBox.Show(message);
    }
}


引导程序:

class AppBootstrapper : Bootstrapper<MainWindowViewModel>
{
      public static readonly Container ContainerInstance = new Container();

    protected override void Configure()
    {
        ContainerInstance.Register<IWindowManager, WindowManager>();
        ContainerInstance.RegisterSingle<IEventAggregator,EventAggregator>();
        ContainerInstance.Register<MainWindowViewModel, MainWindowViewModel>();

        ContainerInstance.Verify();
    }

    protected override IEnumerable<object> GetAllInstances(Type service)
    {
        return ContainerInstance.GetAllInstances(service);
    }

    protected override object GetInstance(System.Type service, string key)
    {
        return ContainerInstance.GetInstance(service);
    }

     protected override void BuildUp(object instance)
    {
        ContainerInstance.InjectProperties(instance);
    }
}


任何想法我所缺少的,我觉得我一定不能在某个地方链接...

我正在使用SimpleInjector作为IOC容器

编辑:

似乎很简单,我不知道自己在做什么。 RTFM。

实现IHandle确实可行。但是,似乎在第一次处理该类型时就调用了两次。我将调查原因。

最佳答案

听起来您已经找到了一种解决方案。

我相信只要您使用与发布时兼容的类型来实现IHandle<T>接口,它就可以工作。例如:

class MainWindowViewModel : Screen, IHandle<string>
{
    //... Your Code

    public void Handle(string myEventstring)
    {
        // Do Something.
    }
}


如果有帮助的话,当我使用EventAggregator时,我倾向于创建一个静态的EventAggregator实例(来自一个小助手类),该实例可以在需要它的任何ViewModels中使用-在您遇到以下情况时可能会有所帮助实际上,是偶然地多次初始化了EventAggregator(可能是造成双重事件的原因)。

有时,我还会创建一些小的帮助程序类来包装事件信息。例如:

public sealed class DownloadFinishedEvent
{
    public readonly string EventText = "Download Completed";

    // Additional Download Info Here.

    public override string ToString()
    {
        return this.EventText;
    }
}

10-07 14:13