我正在使用MVVM Light。当我在我的资源中添加更多值转换器时,我的应用程序崩溃,但异常:
类型' System.InvalidOperationException'的例外情况发生在Microsoft.Practices.ServiceLocation.DLL中,但未在用户代码中处理
其他信息:必须设置ServiceLocationProvider。
在App.xaml.cs
OnLaunched事件中,我有这一行
ServiceLocator.Current.GetInstance<MyViewModel>();
那里崩溃了.. 在这个ServiceLocator中,我可以看到有一个SetLocatorProvider方法,它将ServiceLocatorProvider作为参数。我无法在Web和微软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类型的异常&#39;发生在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() {}
}
答案 0 :(得分:5)
我有点想通了。
还需要注册ViewModel,这是在ViewModelLocator构造函数中发生的,但由于某种原因,构造函数稍后执行。所以我修改了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>();
...
}
答案 1 :(得分:1)
您没有设置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>();
}
}