MVVM-light已经注册了一个工厂用于INavigationService。

11

我正在尝试将我的WP8项目从自己制作的MVVM实现调整为MVVM Light。

应用程序可以编译通过,但当我在Expression Blend中打开MainPage.xaml时,会收到以下错误:

类项目.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个回答

18

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

  1. 注册时不使用工厂(不推荐)

    SimpleIoc.Default.Register<INavigationService>();

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

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

  3. 通过使构造函数静态来防止ViewModelLocator被设计者/Blend多次创建

    static ViewModelLocator() { ... }

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


1
我最终让我的ViewModelLocator看起来像这样:http://i.imgur.com/2Ex0rzy.png。在初始化时,简单地退出,以防止VS设计器认为在设计时间再次构造它是个好主意。感谢指引! - René Sackers
使用ViewModelLocator的构造函数的第三种静态方式对我有效! - Pseudonymous

0

这似乎是一个非常老的问题,但经过几个小时的谷歌搜索,这是唯一一个与我的问题类似的问题,所以在这里回答,以便其他人参考。

确保你的ViewModelLocator上有IsDataSource:

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

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

奇怪的是,在添加这个之后,所有的“INavigationService已经注册”的错误都消失了!


0

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

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

如果您确实需要一个工厂方法,那么您可以像之前一样使用设计模式检查,将这行代码与您的工厂方法一起混合使用。
if (ViewModelBase.IsInDesignModeStatic)
{
    SimpleIoc.Default.Register<INavigationService, NavigationService>();
}
else
{
    SimpleIoc.Default.Register<INavigationService>(CreateNavigationService);
}

0

我不确定为什么,但只有当我的XAML设计师窗口打开时,我才会遇到这个错误。当我关闭它并编译时,错误就消失了,项目也可以顺利构建和运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接