MVVM-light已经有一个为INavigationService注册的工厂

问题描述 投票:9回答:4

我正在尝试将我的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,那么问题可能是什么?

有任何想法吗? :)

windows-phone-7 mvvm-light
4个回答
14
投票

我有同样的问题,这似乎是一个Visual Studio问题与XAML-Designer,静态工厂/定位器和设计时创建对象相结合。但是:解决方案如下:

  1. 无工厂注册(不推荐) SimpleIoc.Default.Register<INavigationService>();
  2. 或者如果您想使用工厂,请在注册工厂之前取消注册 SimpleIoc.Default.Unregister<INavigationService>(); SimpleIoc.Default.Register<INavigationService>(() => new NavigationService());
  3. 通过使构造函数静态,防止Designer / Blend多次创建ViewModelLocator static ViewModelLocator() { ... }

错误很麻烦但在这种情况下可能会发生:您在设计时创建对象(可能是App.xaml中的ViewModelLocator),每当您在代码中更改某些内容时,都会触发编译器并重新创建ViewModelLocator而不会取消注册服务。因此它会抱怨工厂已经注册。理论上,当多次注册没有工厂的类时,也应该存在错误。


0
投票

现在可能已经解决了,但我认为你可以通过不使用工厂方法覆盖来解决你的示例中的问题。

SimpleIoc.Default.Register<INavigationService, NavigationService>();

如果您确实需要工厂方法,那么您可以使用设计模式检查将此行与工厂方法方法混合使用。

if (ViewModelBase.IsInDesignModeStatic)
{
    SimpleIoc.Default.Register<INavigationService, NavigationService>();
}
else
{
    SimpleIoc.Default.Register<INavigationService>(CreateNavigationService);
}

0
投票

这似乎是一个超级古老的问题,但经过几个小时的谷歌搜索,这是唯一的问题类似于我的问题,所以在这里回答其他人。

确保ViewModelLocator上有IsDataSource:

<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />

这解决了我的问题,我的设计数据立刻浮出水面。

奇怪的是,在完成之后,我的所有“INAVigationService已经注册”错误都消失了!


0
投票

不知道为什么,但是当我的xaml设计器窗口打开时,我才会收到此错误。当我用它关闭编译时,错误消失,项目构建并成功运行。

© www.soinside.com 2019 - 2024. All rights reserved.