ServiceLocationProvider must be set
Solution 1
I kinda figured it out.
There was also a need to register the ViewModel, something that happened in the ViewModelLocator constructor, but for some reason the constructor is executed later. So I modified the ViewModelLocator class like this:
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() {}
}
}
Then in the App.xaml.cs:
...OnLaunched(...)
{
...
DispatcherHelper.Initialize();
ViewModelLocator.SetAndReg();
ServiceLocator.Current.GetInstance<MyViewModel>();
...
}
Solution 2
You are not setting the LocationProvider (well the error message is quite obvious..):
You need to give the ServiceLocator your IoC Container of choice: See this example which uses Unity and an Adapter:
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>();
}
}
v.g.
Updated on July 25, 2022Comments
-
v.g. almost 2 years
I am using MVVM Light. When I add more value converters in my resources my app crashes with exception:
An exception of type 'System.InvalidOperationException' occurred in Microsoft.Practices.ServiceLocation.DLL but was not handled in user code
Additional information: ServiceLocationProvider must be set.
In the
App.xaml.cs
OnLaunched event I have this lineServiceLocator.Current.GetInstance<MyViewModel>();
It crashes there.. In this ServiceLocator I can see there is a SetLocatorProvider method which takes as an argument ServiceLocatorProvider. I couldnt find anything in the Web and Microsofts MSDN page is dated:
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>(); }
EDIT: Here is the full OnLaunched event. After putting
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
an exception occures:
An exception of type Microsoft.Practices.ServiceLocation.ActivationException' occurred in GalaSoft.MvvmLight.Extras.DLL but was not handled in user code
Additional information: Type not found in cache: cMC.ViewModel.MyViewModel.
This is the code of 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() {} }