Caliburn.Micro EventAggregator

Nic*_*ams 3 c# eventaggregator caliburn.micro

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

我不确定问题是视图模型还是引导程序.这是viewmodel:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

引导程序:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我使用SimpleInjector作为IOC容器

编辑:

这似乎是一个非常简单的例子,我不知道自己在做什么.RTFM.

实现IHandle确实有效.它似乎在第一次处理类型时被调用了两次.我会做一些调查,为什么.

Chr*_*ris 6

听起来你已经达到了各种各样的解决方案.

我相信它应该可行,前提是您IHandle<T>使用与您正在发布的兼容类型实现接口.例如:

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

    public void Handle(string myEventstring)
    {
        // Do Something.
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有用的话,当我使用它时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;
    }
}
Run Code Online (Sandbox Code Playgroud)