2014-09-03 6 views
1

Использование MVVM Light в приложении WPF MVVM.Использование Ninject с MVVM Light

Я хочу использовать Ninject вместо SimpleIOC.

Даже в совершенно новом проекте WPF/MVVM Light v4 я получаю нулевую ссылку для MainViewModel, когда основное свойство в ViewModelLocator вызывается XAML.

private static readonly StandardKernel kernel; 

    static ViewModelLocator() 
    { 
     if (ViewModelBase.IsInDesignModeStatic) 
     { 
     } 
     else 
     { 
      kernel = new StandardKernel(new mymodule()); 
     } 
    } 

    public MainViewModel Main 
    { 
     get { return kernel.Get<MainViewModel>(); } 
    } 

MyModule выглядит следующим образом:

public class mymodule:NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<MainViewModel>().ToSelf(); 
    } 
} 

Я также попытался

public class mymodule:NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<MainViewModel>().To<MainViewModel(); 
    } 
} 
+0

Является ли kernel.Get возвращает null или ядро ​​null? –

+0

В случае возникновения исключений всегда указывайте полный тип исключения, сообщение и stacktrace по образцу кода. – BatteryBackupUnit

ответ

2

Ninject загрузки ядра .Get<T> не возвращает нуль.

За исключением в случае, если явно указать его, выполнив:

  • Bind<T>().ToConstant(null);
  • Bind<T>().ToMethod(x => null);
  • Bind<T>().ToProvider<TProvider>() -> и TProvider.Create(...) возвращает нулевое значение

Так что, если есть NullReferenceException при доступе свойство Main, это должно быть потому, что private static readonly StandardKernel kernel - null. Теперь, если код, который вы нам предоставили, является Minimal, Complete, and Verifiable example, то есть ViewModelBase.IsInDesignModeStatic возвращает true.