Caliburn.Micro的DisplayRootViewFor方法会抛出NullReferenceException异常。

5

我在我的引导程序中有以下代码:

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方法: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>();
    }

奇怪的是,在这些代码行中没有任何异常。 viewviewmodel 都有引用,InitialView 的构造函数已被调用,但当它到达并调用 DisplayRootViewFor 时,仍然会抛出异常。

我应该做出哪些改变?

3个回答

10

我的容器缺少一个关键部件:

container.Singleton<IWindowManager, WindowManager>();

0
你混淆了SimpleContainer和MEF注入。你应该只使用其中之一。
MEF: 如果你的InitialViewModel需要使用MEF进行构造函数注入,那么你必须创建一个Bootstrapper来处理它,就像这个post中所示。记得导出你的InitialViewModel并删除SimpleContainer代码。
SimpleContainer: 或者你可以移除MEF(通过简单地移除ImportingConstructor-Attribute),SimpleContainer将会接管工作。
如果你的InitialViewModel附加到主窗口上,它应该继承Caliburn.Micro Screen类。

感谢您的更正。不幸的是,删除属性并从Screen继承并不能解决问题,异常仍然存在。 - Nestor

0

在你的引导程序构造函数中需要调用 Initialize() 方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接