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

时间:2013-07-11 12:58:49

标签: 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>();
    }

从我的代码注释中可以看出,我已经尝试过这里的修复,但我仍然在Blend中遇到此错误。我没有其他地方可以注册INavigationService,那么问题可能是什么呢?

有什么想法吗? :)

4 个答案:

答案 0 :(得分:13)

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

  1. 无工厂注册(不推荐)

    SimpleIoc.Default.Register<INavigationService>();

  2. 或者如果您想使用工厂,请在注册工厂前取消注册

    SimpleIoc.Default.Unregister<INavigationService>(); SimpleIoc.Default.Register<INavigationService>(() => new NavigationService());

  3. 通过使构造函数静态阻止设计者/混合创建ViewModelLocator多次

    static ViewModelLocator() { ... }

  4. 错误很麻烦,但在这种情况下可能会发生:您在设计时创建对象(可能是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窗口打开时才会出现此错误。当我关闭它进行编译时,错误消失了,并且该项目已构建并成功运行。