MVVM Lightを使用しています。リソースに値コンバーターを追加すると、例外が発生してアプリがクラッシュします。
タイプSystem.InvalidOperationExceptionの例外がMicrosoft.Practices.ServiceLocation.DLLで発生しましたが、ユーザーコードでは処理されませんでした
追加情報:ServiceLocationProviderを設定する必要があります。
の中に App.xaml.cs
OnLaunchedイベントこの行があります
ServiceLocator.Current.GetInstance<MyViewModel>();
それはそこでクラッシュします。このServiceLocatorには、引数としてServiceLocatorProviderを取るSetLocatorProviderメソッドがあることがわかります。私はWebで何も見つけることができず、MicrosoftのMSDNページには日付が付けられています。
protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
...
}
if (rootFrame.Content == null)
{
...
}
Window.Current.Activate();
DispatcherHelper.Initialize();
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
ServiceLocator.Current.GetInstance<MyViewModel>();
}
編集:ここに完全なOnLaunchedイベントがあります。置いた後
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
例外が発生します:
タイプMicrosoft.Practices.ServiceLocation.ActivationException 'の例外がGalaSoft.MvvmLight.Extras.DLLで発生しましたが、ユーザーコードでは処理されませんでした
追加情報:タイプがキャッシュに見つかりません:cMC.ViewModel.MyViewModel。
これはViewModelLocatorのコードです
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MyViewModel>();
}
public MyViewModel MyVM
{
get
{
return ServiceLocator.Current.GetInstance<MyViewModel>();
}
}
public static void Cleanup() {}
}
ちょっとわかりました。
また、ViewModelLocatorコンストラクタで発生したViewModelを登録する必要もありましたが、何らかの理由でコンストラクタが後で実行されました。そこで、次のようにViewModelLocatorクラスを変更しました。
public class ViewModelLocator
{
public ViewModelLocator()
{
}
public static void SetAndReg()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MyViewModel>();
}
public MyViewModel MyVM
{
get
{
return ServiceLocator.Current.GetInstance<MyViewModel>();
}
}
public static void Cleanup() {}
}
}
次に、App.xaml.csで:
...OnLaunched(...)
{
...
DispatcherHelper.Initialize();
ViewModelLocator.SetAndReg();
ServiceLocator.Current.GetInstance<MyViewModel>();
...
}
LocationProviderを設定していません(エラーメッセージは非常に明白です)。
ServiceLocatorに選択したIoCコンテナーを与える必要があります。Unityとアダプターを使用する次の例を参照してください。
static ViewModelLocator()
{
var container = new UnityContainer();
ServiceLocator.SetLocatorProvider(() => new UnityServiceLocatorAdapter(container));
container.RegisterInstance<ILoggingService>(new ConsoleLoggingService());
container.RegisterInstance<IMessageBoxService>(new SimpleMessageBoxService());
container.RegisterInstance<ITestSuiteService>(new TestSuiteService());
container.RegisterInstance<IApplicationService>(new ApplicationService());
}
/// <summary>
/// Gets the <see cref="BackstageAboutViewModel"/>.
/// </summary>
public BackstageAboutViewModel BackstageAboutViewModel
{
get
{
return ServiceLocator.Current.GetInstance<BackstageAboutViewModel>();
}
}