Caliburn.Micro DisplayRootViewFor抛出NullReferenceException

时间:2016-03-01 10:56:55

标签: c# caliburn.micro

我的Bootstrapper中有以下代码:

private SimpleContainer container;

protected override void Configure()
{
  container = new SimpleContainer();
  container.Singleton<IEventAggregator, EventAggregator>();
  container.PerRequest<InitialViewModel>();  
}

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);
}

在OnStartup方法中,我调用DisplayRooViewFor方法:

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

这是InitialViewModel:

    private IEventAggregator eventAggregator;    

    public InitialViewModel(IEventAggregator ea) 
    {
      eventAggregator = ea;
    }

不幸的是,它会抛出 NullReferenceException

  

发生了'System.NullReferenceException'类型的异常   Caliburn.Micro.Platform.dll但未在用户代码中处理

我检查了CM的源代码并使用相同的代码来测试它:

  protected override void OnStartup(object sender, StartupEventArgs e)
    {
      var viewModel = IoC.GetInstance(typeof(InitialViewModel), null);
      var view = ViewLocator.LocateForModel(viewModel, null, null);
      ViewModelBinder.Bind(viewModel, view, null);

      var activator = viewModel as IActivate;
      if (activator != null)
        activator.Activate();

      DisplayRootViewFor<InitialViewModel>();
    }

奇怪的是,这些线上没有例外。 view viewmodel 都有引用, InitialView 的构造函数被调用,但当它到达并调用DisplayRootViewFor时,它仍然抛出异常。

我应该改变什么?

3 个答案:

答案 0 :(得分:9)

我的容器缺少关键组件:

container.Singleton<IWindowManager, WindowManager>();

答案 1 :(得分:0)

您在SimpleContainer和MEF注入之间进行混合。你应该只使用其中一个。

<强> MEF : 如果您的InitialViewModel应该使用MEF进行构造函数注入,则必须创建一个Bootstrapper来处理它,就像在post中一样。请记住导出您的InitialViewModel并删除SimpleContainer代码。

<强> SimpleContainer 或者你删除MEF(通过简单地删除ImportingConstructor-Attribute),SimpleContainer将接受Job。

你的InitialViewModel应该继承Caliburn.Micro Screen类,如果它附在主窗口上。

答案 2 :(得分:0)

初​​始化();需要在Bootstrapper CTOR中调用方法。