Windows phone 7 MVVM light已经有一个工厂注册了INavigationService

Windows phone 7 MVVM light已经有一个工厂注册了INavigationService,windows-phone-7,mvvm-light,Windows Phone 7,Mvvm Light,我正在尝试将我的WP8项目从自制的MVVM实现调整为MVVM Light 应用程序编译时没有错误,但当我在Expression Blend中打开MainPage.xaml时,会出现以下错误: 类project.Services.INavigationService已注册。App.xaml My ViewModelLocator.cs: /// <summary> /// Initializes a new instance of the ViewModelLocato

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

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

类project.Services.INavigationService已注册。App.xaml

My 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>();
    }
//
///初始化ViewModelLocator类的新实例。
/// 
公共ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);
if(ViewModelBase.IsIndesignatic)
{
}
其他的
{
如果(!SimpleIoc.Default.IsRegistered())
{
simpleoc.Default.Register(()=>newNavigationService());
}
}
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
}
正如您从我的代码注释中所看到的,我已经尝试了这里假设的修复,但是我仍然在混合中遇到这个错误。没有其他地方可以注册INavigationService,那么会有什么问题


有什么想法吗?:)

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

SimpleIoc.Default.Register<INavigationService, NavigationService>();
simpleoc.Default.Register();
如果您确实需要工厂方法,那么您可以像以前一样使用设计模式检查将这一行与工厂方法方法混合使用

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

这似乎是一个非常古老的问题,但在谷歌搜索了几个小时后,这是唯一一个与我的问题类似的问题,所以在这里为其他人回答

确保ViewModelLocator上有IsDataSource:

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

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


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

我也有同样的问题,这似乎是VisualStudio与XAML设计器、静态工厂/定位器以及对象的设计时创建相结合的问题。然而,解决办法如下:

  • 无工厂注册(不推荐)

    simpleoc.Default.Register()

  • 或者,如果要使用工厂,请在注册工厂之前取消注册

    SimpleIoc.Default.Unregister()
    
    SimpleIoc.Default.Register(()=>newNavigationService())

  • 通过使构造函数为静态,防止设计器/混合多次创建ViewModelLocator

    静态ViewModelLocator(){…}


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

    不确定原因,但我只有在打开xaml设计器窗口时才会出现此错误。当我关闭ViewModelLocator进行编译时,错误消失,项目成功构建并运行。

    我最终使ViewModelLocator看起来像这样:简单地退出初始化,以防VS设计器认为在设计时再次构建它是个好主意。谢谢你的指点!第三个选择是使
    ViewModelLocator
    静态的构造函数对我有用!