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