Caliburn.Micro DisplayRootViewFor引发的NullReferenceException

Caliburn.Micro DisplayRootViewFor引发的NullReferenceException

问题描述:

我在我的引导程序下面的代码:Caliburn.Micro DisplayRootViewFor引发的NullReferenceException

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

奇怪的是,这些行没有例外。 视图视图模型有参考,并且InitialView的构造函数被调用,但是当它到达并调用DisplayRootViewFor时,它仍会引发异常。

我应该改变什么?

我的容器是缺少的重要组成部分:

container.Singleton<IWindowManager, WindowManager>(); 

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

MEF: 如果您InitialViewModel应该使用MEF的构造函数注入,你必须创建一个引导程序来处理它,就像这个post。请记住导出您的InitialViewModel并删除SimpleContainer代码。或者您删除MEF(通过简单地删除ImportingConstructor-Attribute),SimpleContainer将采用Job。

如果您的InitialViewModel附带在主窗口中,您应该继承Caliburn.Micro Screen类。

+0

谢谢你的更正。不幸的是,删除属性并从屏幕继承不能解决问题,异常仍然存在。 – Nestor

Initialize();方法需要在Bootstrapper CTOR中调用。

+0

'Initialize'方法已经存在。 – Nestor