我正在使用MVVM Light。当我在资源中添加更多值(value)转换器时,我的应用程序崩溃,但出现以下异常:
在App.xaml.cs
OnLaunched事件中,我有这一行
ServiceLocator.Current.GetInstance<MyViewModel>();
它在那里崩溃了。在此ServiceLocator中,我可以看到有一个SetLocatorProvider方法,该方法将ServiceLocatorProvider作为参数。我在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);
发生异常:附加信息:在缓存中找不到类型: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() {}
}
最佳答案
我有点想通了。
还需要注册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>();
...
}
关于c# - 必须设置ServiceLocationProvider,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28043565/