2016-03-01 88 views
5

我在我的引導程序下面的代碼: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時,它仍會引發異常。

我應該改變什麼?

回答

8

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

container.Singleton<IWindowManager, WindowManager>(); 
0

您正在SimpleContainer和MEF注入之間進行混合。你應該只使用其中之一。

MEF: 如果您InitialViewModel應該使用MEF的構造函數注入,你必須創建一個引導程序來處理它,就像這個post。請記住導出您的InitialViewModel並刪除SimpleContainer代碼。或者您刪除MEF(通過簡單地刪除ImportingConstructor-Attribute),SimpleContainer將採用Job。

如果您的InitialViewModel附帶在主窗口中,您應該繼承Caliburn.Micro Screen類。

+0

謝謝你的更正。不幸的是,刪除屬性並從屏幕繼承不能解決問題,異常仍然存在。 – Nestor

0

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

+0

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

相關問題