11

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

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

类 project.Services.INavigationService 已注册。应用程序.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

4 回答 4

18

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

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

    SimpleIoc.Default.Register<INavigationService>();

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

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

  3. 通过将构造函数设为静态,防止设计器/Blend 多次创建 ViewModelLocator

    static ViewModelLocator() { ... }

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

于 2015-03-07T14:03:18.367 回答
0

这似乎是一个非常古老的问题,但经过数小时的谷歌搜索,这是唯一与我的问题相似的问题,所以在这里为其他人回答。

确保您的 ViewModelLocator 上有 IsDataSource:

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

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

奇怪的是,穿上它之后,我所有的“INavigationService 已注册”错误都消失了!

于 2015-01-05T08:08:53.303 回答
0

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

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

如果您确实需要工厂方法,那么您可以像以前一样使用设计模式检查将这条线与您的工厂方法方法混合使用。

if (ViewModelBase.IsInDesignModeStatic)
{
    SimpleIoc.Default.Register<INavigationService, NavigationService>();
}
else
{
    SimpleIoc.Default.Register<INavigationService>(CreateNavigationService);
}
于 2014-12-14T17:34:46.017 回答
0

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

于 2019-04-01T23:43:04.623 回答