我正在尝试将我的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>();
}
从我的代码注释中可以看出,我已经尝试过这里假设的修复,但我仍然在Blend中遇到这个错误。没有其他地方可以注册INavigationService,那么问题可能是什么?
有任何想法吗? :)
我有同样的问题,这似乎是一个Visual Studio问题与XAML-Designer,静态工厂/定位器和设计时创建对象相结合。但是:解决方案如下:
SimpleIoc.Default.Register<INavigationService>();
SimpleIoc.Default.Unregister<INavigationService>();
SimpleIoc.Default.Register<INavigationService>(() => new NavigationService());
static ViewModelLocator() { ... }
错误很麻烦但在这种情况下可能会发生:您在设计时创建对象(可能是App.xaml中的ViewModelLocator
),每当您在代码中更改某些内容时,都会触发编译器并重新创建ViewModelLocator而不会取消注册服务。因此它会抱怨工厂已经注册。理论上,当多次注册没有工厂的类时,也应该存在错误。
现在可能已经解决了,但我认为你可以通过不使用工厂方法覆盖来解决你的示例中的问题。
SimpleIoc.Default.Register<INavigationService, NavigationService>();
如果您确实需要工厂方法,那么您可以使用设计模式检查将此行与工厂方法方法混合使用。
if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<INavigationService, NavigationService>();
}
else
{
SimpleIoc.Default.Register<INavigationService>(CreateNavigationService);
}
这似乎是一个超级古老的问题,但经过几个小时的谷歌搜索,这是唯一的问题类似于我的问题,所以在这里回答其他人。
确保ViewModelLocator上有IsDataSource:
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
这解决了我的问题,我的设计数据立刻浮出水面。
奇怪的是,在完成之后,我的所有“INAVigationService已经注册”错误都消失了!
不知道为什么,但是当我的xaml设计器窗口打开时,我才会收到此错误。当我用它关闭编译时,错误消失,项目构建并成功运行。