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类。
谢谢你的更正。不幸的是,删除属性并从屏幕继承不能解决问题,异常仍然存在。 – Nestor