web-dev-qa-db-ja.com

ServiceLocationProviderを設定する必要があります

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() {}
}
8
v.g.

ちょっとわかりました。

また、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>();
...
}
5
v.g.

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>();
        }
    }
1
Xeun