2016-02-09 46 views
0

我剛開始使用Ninject(3.2.2.0)的DI爲我的MVVM的項目。我的實現目前非常簡單 - 沒有與Ninject一起使用的接口,只對ViewModel進行DI操作。正在處理MainWindow的XAML時,我得到一個NullReferenceException。在NRE之前,View & ViewModel的構造函數已成功完成。 App.OnStartup()完成後發生異常。這裏是App.xaml.cs:的NullReferenceException在Ninject在XAML

namespace PSS 
{ 
    public partial class App : Application 
    { 
     private IKernel Container; 

     protected override void OnStartup(StartupEventArgs e) 
     { 
      base.OnStartup(e); 
      Container = new StandardKernel(); 
      Application.Current.MainWindow = Container.Get<MainWindow>(); 
      Application.Current.MainWindow.Show(); 
     } 
    } 
} 

這裏是MainWindow.xaml.cs:

namespace PSS 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow(MainWindowVM viewModel) 
     { 
      DataContext = viewModel; 
      InitializeComponent(); 
      Messenger.Default.Register<string>(this, UICommands); 
      CMTextBox.Focus(); 
     } 
    } 
} 

任何建議,爲什麼在XAML的東西顯然沒有得到初始化?我在XAML中使用了幾個IValueConverter,但是當我刪除它們的引用時,NRE仍然會發生。

編輯:NRE的堆棧跟蹤:

System.NullReferenceException was unhandled 
    _HResult=-2147467261 
    _message=Object reference not set to an instance of an object. 
    HResult=-2147467261 
    IsTransient=false 
    Message=Object reference not set to an instance of an object. 
    Source=mscorlib 
    StackTrace: 
    at System.DefaultBinder.BindToMethod(BindingFlags bindingAttr, MethodBase[] match, Object[]& args, ParameterModifier[] modifiers, CultureInfo cultureInfo, String[] names, Object& state) 
    at MS.Internal.Xaml.Runtime.DynamicMethodRuntime.CreateInstanceWithCtor(Type type, Object[] args) 
    at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstance(XamlType xamlType, Object[] args) 
    at System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx) 
    at System.Xaml.XamlObjectWriter.WriteStartMember(XamlMember property) 
    at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector) 
    at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) 
    at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) 
    at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) 
    at System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc) 
    at System.Windows.Application.DoStartup() 
    at System.Windows.Application.<.ctor>b__1_0(Object unused) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.ProcessQueue() 
    at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Application.RunDispatcher(Object ignore) 
    at System.Windows.Application.RunInternal(Window window) 
    at PSS.App.Main() in c:\Users\conrad\VSSolutions\Measurements\PSS\obj\Debug\App.g.cs:line 0 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
+1

哪裏是異常的詳細信息?調試時,當異常對話框彈出時,點擊底部的鏈接,指出「將異常詳細信息複製到剪貼板」並粘貼到[編輯]中。警告:如果你截取對話框的屏幕截圖並粘貼*,那麼我會用一千個太陽的力量來做這件事。 – Will

+0

@ Will stacktrace added – Conrad

+0

嗯,這是一個squirly之一。我敢打賭,你有一些正在拋出的SOMETHING,這是在構造函數中拋出一個異常。所以我要做的就是爲XAML中引用的任何*任何東西*以及*這些東西引用的東西*,我會詳細檢查它們的每個構造函數(只是您的代碼,介意你)。這通常足以檢測可能發生NRE而不能正確處理的地方。如果你無法弄清楚,在每一個ctor中放置一個斷點,然後在加載過程中遍歷它。 – Will

回答

0

我剛剛經歷了同樣的問題與

雖然我研究,我發現,如果我重寫OnStartup方法,我應該刪除StartupUriApp.xaml爲我解決了這個問題。

既然你要重寫OnStartup過,我相信它會爲您解決了。

相關問題