【问题标题】:Caliburn.Micro DisplayRootViewFor throws NullReferenceExceptionCaliburn.Micro DisplayRootViewFor 抛出 NullReferenceException
【发布时间】:2016-03-01 10:56:55
【问题描述】:

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

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

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

我应该改变什么?

【问题讨论】:

    标签: c# caliburn.micro


    【解决方案1】:

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

    container.Singleton<IWindowManager, WindowManager>();
    

    【讨论】:

      【解决方案2】:

      您正在混合 SimpleContainer 和 MEF 注入。您应该只使用其中之一。

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

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

      如果 InitialViewModel 附加到主窗口,则它应该继承 Caliburn.Micro Screen 类。

      【讨论】:

      • 感谢您的更正。不幸的是,删除属性并从 Screen 继承并不能解决问题,异常仍然存在。
      【解决方案3】:

      初始化();方法需要在您的引导程序 CTOR 中调用。

      【讨论】:

        猜你喜欢
        • 2017-09-01
        • 1970-01-01
        • 2013-05-30
        • 2020-11-17
        • 2016-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多