Mam*_*chi 10 windows-phone-7 mvvm-light
我正在尝试将我的WP8项目从自制MVVM实现调整到MVVM Light.
应用程序编译没有错误,但是当我在Expression Blend中打开我的MainPage.xaml时,我将收到此错误:
类project.Services.INavigationService已经注册.App.xaml中
我的ViewModelLocator.cs:
/// <summary>
/// Initializes a new instance of the ViewModelLocator class.
/// </summary>
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
}
else
{
if (!SimpleIoc.Default.IsRegistered<INavigationService>())
{
SimpleIoc.Default.Register<INavigationService>(() => new NavigationService());
}
}
SimpleIoc.Default.Register<MainPage>();
SimpleIoc.Default.Register<SettingsEditViewModel>();
}
Run Code Online (Sandbox Code Playgroud)
从我的代码注释中可以看出,我已经尝试过这里假设的修复,但我仍然在Blend中遇到这个错误.没有其他地方可以注册INavigationService,那么问题可能是什么?
有任何想法吗?:)
Ale*_*cha 15
我有同样的问题,这似乎是一个Visual Studio问题与XAML-Designer,静态工厂/定位器和设计时创建对象相结合.但是:解决方案如下:
无工厂注册(不推荐)
SimpleIoc.Default.Register<INavigationService>();
或者如果您想使用工厂,请在注册工厂之前取消注册
SimpleIoc.Default.Unregister<INavigationService>();
SimpleIoc.Default.Register<INavigationService>(() => new NavigationService());
通过使构造函数静态,防止Designer/Blend多次创建ViewModelLocator
static ViewModelLocator() { ... }
错误很麻烦但在这种情况下可能会发生:您在设计时(ViewModelLocator可能在App.xaml中)创建对象,并且每当您更改代码中的某些内容时,都会触发编译器并重新创建ViewModelLocator而无需取消注册服务.因此它会抱怨在工厂已经注册.理论上,当多次注册没有工厂的类时,也应该存在错误.
小智 0
现在可能已经解决了,但我认为您可以通过不使用工厂方法覆盖来解决示例案例中的问题。
SimpleIoc.Default.Register<INavigationService, NavigationService>();
Run Code Online (Sandbox Code Playgroud)
如果您确实需要工厂方法,那么您可以像以前一样使用设计模式检查将此行与工厂方法方法混合在一起。
if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<INavigationService, NavigationService>();
}
else
{
SimpleIoc.Default.Register<INavigationService>(CreateNavigationService);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3651 次 |
| 最近记录: |