2013-07-11 6 views
7

Ich versuche mein WP8-Projekt von selbst gemachten MVVM-Implementierung zu MVVM Light anzupassen.MVVM-light Es ist bereits eine Fabrik für INavigationService registriert

Die Anwendung kompiliert ohne Fehler, aber wenn ich meine MainPage.xaml in Expression Blend öffnen, werde ich diesen Fehler:

Klasse project.Services.INavigationService bereits registriert ist. App.xaml

Mein 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>(); 
    } 

Wie Sie aus meinem Code Kommentar sehen können, habe ich bereits versucht, das Update hier angenommen, aber ich bin immer noch diesen Fehler in Mischung zu bekommen. Es gibt keinen anderen Ort mehr, an dem ich den INavigationService registrieren könnte. Was könnte das Problem sein?

Irgendwelche Ideen? :)

Antwort

0

Könnte schon jetzt gelöst sein, aber ich denke, Sie können das Problem in Ihrem Beispielfall lösen, indem Sie nicht die Factory-Methode überschreiben.

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

Wenn Sie eine Factory-Methode tun müssen, dann können Sie diese Zeile mischen sich mit Ihrem Factory-Methode Ansatz unter Verwendung des Entwurfsmodus Prüfung wie Sie gewesen sind. Diese

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

scheint wie ein Super alte Frage, aber nach Stunden googeln, ist dies die einzige Frage, die zu meinem Problem ähnlich ist, so dass hier für andere Menschen zu beantworten. tauchte sofort

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

Das ist mein Problem und meine Konstruktionsdaten gelöst:

Stellen Sie sicher, dass Sie auf Ihrem IsDataSource ViewModelLocator haben.

Seltsam, nach dem Einschalten alle meine "INavigationService ist bereits registriert" Fehler geht weg!

10

Ich hatte das gleiche Problem, und dies scheint ein Visual Studio-Problem in Kombination mit XAML-Designer, statische Fabriken/Locators und Design-Time-Erstellung von Objekten. Allerdings: Die Lösungen waren die folgenden:

  1. Register ohne Werk (nicht empfohlen)

    SimpleIoc.Default.Register<INavigationService>();

  2. Oder wenn Sie möchten, um eine Fabrik verwenden, austragen bevor sie das Werk

    Registrierung

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

  3. verhindern, dass die ViewModelLocator von mehr als einmal, indem der Konstruktor statisch

    static ViewModelLocator() { ... }

  4. von dem Designer/Mischung erstellt werden

Der Fehler umständlich ist, aber in diesem Szenario passieren könnte: Sie erstellen Objekte während der Design-Zeit (die ViewModelLocator innerhalb der App.xaml wahrscheinlich) und wenn Sie etwas in Ihrem Code ändern, wird der Compiler ausgelöst und der ViewModelLocator wird neu erstellt, ohne die Dienste zu entfernen. Deshalb wird es sich beklagen, dass in der Fabrik bereits registriert worden ist. Theoretisch sollte es bei der mehrfachen Registrierung von Klassen ohne Fabriken auch einen Fehler geben.

+1

2. wurde nicht für mich arbeiten, aber 3. tat ich – Rivenfall

+0

Ich landete machen meine ViewModelLocator wie folgt aussehen: http://i.imgur.com/2Ex0rzy.png Einfach aus der Initialisierung, falls der VS Designer hält es für eine gute Idee, es in der Entwurfszeit erneut zu konstruieren. Danke für den Zeiger! –