尝试使用 EventAggregator 时 Caliburn.Micro 的 DisplayRootViewFor 方法出现 NullReferenceException

NullReferenceException in Caliburn.Micro's DisplayRootViewFor method when trying to use EventAggregator

我正在尝试在我的 WPF 项目中使用 Caliburn Micro 的内置 EventAggregator,基于 this documentation。但是文档(我几乎总是在 Caliburn Micro 中找到它)似乎不完整,即示例代码不包含所有实现要求。

特别是,我没有在我的项目中使用 IoC 容器,我确定我遗漏或滥用了它的某些配置,这就是导致问题的原因。

问题:

备注:

有人可以向我解释为什么 Caliburn.Micro 抛出这个异常,以及我应该如何将 EventAggregator 注入到我的主视图模型中吗? (因为试图将它作为参数传递给 DisplayRootViewFor 似乎没有用。)


我的应用程序引导程序如下所示 – 基于 The Event Aggregator and the Simple IoC Container 文档页面的组合:

public class AppBootstrapper : BootstrapperBase
{
    private readonly SimpleContainer _container =
        new SimpleContainer();

    public AppBootstrapper()
    {
        Initialize();
    }

    protected override void Configure()
    {
        _container.Singleton<IEventAggregator, EventAggregator>();
    }

    protected override object GetInstance(Type serviceType, string key)
    {
        return _container.GetInstance(serviceType, key);
    }

    protected override IEnumerable<object> GetAllInstances(Type serviceType)
    {
        return _container.GetAllInstances(serviceType);
    }

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

    protected override void OnStartup(object sender, StartupEventArgs e)
    {
        DisplayRootViewFor<MainViewModel>();
    } 
}

我的 MainViewModel 的构造函数如下所示 - 设置用于注入 EventAggregator:

public MainViewModel(IEventAggregator eventAggregator)
{
    _eventAggregator = eventAggregator;
}

使用 RegisterPerRequest 注册视图模型类型本身。试试这个:

public class HelloBootstrapper : BootstrapperBase
{
    private readonly SimpleContainer _container = new SimpleContainer();
    public HelloBootstrapper()
    {
        Initialize();
    }

    protected override void OnStartup(object sender, StartupEventArgs e)
    {
        base.OnStartup(sender, e);
        DisplayRootViewFor<MainViewModel>();
    }

    protected override void Configure()
    {
        _container.Singleton<IWindowManager, WindowManager>();
        _container.Singleton<IEventAggregator, EventAggregator>();
        _container.RegisterPerRequest(typeof(MainViewModel), null, typeof(MainViewModel));
    }

    protected override object GetInstance(Type serviceType, string key)
    {
        return _container.GetInstance(serviceType, key);
    }

    protected override IEnumerable<object> GetAllInstances(Type serviceType)
    {
        return _container.GetAllInstances(serviceType);
    }

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

另外,下面一段注册每个 ViewModel 的代码也对我有用

public class 引导程序:BootstrapperBase {

    protected SimpleContainer _container = new SimpleContainer();
    public BootStrapper()
    {
        Initialize();
    }

    protected override void Configure()
    {
        _container.Instance(_container);
        _container
            .Singleton<IWindowManager, WindowManager>()
            .Singleton<IEventAggregator, EventAggregator>();

        GetType().Assembly.GetTypes()
            .Where(type => type.IsClass)
            .Where(type => type.Name.EndsWith("ViewModel"))
            .ToList()
            .ForEach(viewModelType => _container.RegisterPerRequest(
                viewModelType, viewModelType.ToString(), viewModelType));
    }

    protected override void OnStartup(object sender, StartupEventArgs e)
    {
        DisplayRootViewFor<ShellViewModel>();
    }

    protected override object GetInstance(Type service, string key)
    {
        return _container.GetInstance(service, key);

    }

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

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