2013-07-11 12 views
7

Próbuję dostosować mój projekt WP8 z własnej implementacji MVVM do MVVM Light.Światło MVVM Jest już zarejestrowana fabryka dla INavigationService

Aplikacja kompiluje bez błędów, ale kiedy otwieram MainPage.xaml w Expression Blend, będę się ten błąd:

Klasa project.Services.INavigationService jest już zarejestrowany. App.xaml

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

Jak widać z mojego kodu komentarzu, ja już próbowałem naprawić rzekomą tutaj, ale ja wciąż otrzymuję ten błąd w mieszance. Nie ma innego miejsca, w którym mógłbym zarejestrować usługę INavigationService, więc jaki mógł być problem?

Wszelkie pomysły? :)

Odpowiedz

0

Być może już udało się rozwiązać problem, ale myślę, że możesz rozwiązać problem w swoim przykładowym przypadku, nie używając fabrycznej metody nadpisania.

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

Jeśli potrzebna jest metoda fabryczna, można ją połączyć z podejściem opartym na metodzie fabrycznej, korzystając z testu trybu projektowania, takiego jaki był.

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

Wydaje się to bardzo stare pytanie, ale po godzinach googlowania, jest to tylko pytanie, które jest podobne do mojego problemu, więc odpowiadając tutaj dla innych ludzi.

Upewnij się, że masz IsDataSource na ViewModelLocator:

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

To rozwiązać mój problem i moje dane projektowe pojawiło się od razu.

Co dziwne, po włączeniu tego, wszystkie moje "Usługa nawigacji jest już zarejestrowana", błędy znikają!

10

Miałem ten sam problem, który wydaje się być problemem Visual Studio w połączeniu z XAML-Designer, Static Factories/Locators i tworzeniem obiektów w czasie projektowania. Jednakże: Rozwiązania były następujące:

  1. Rejestracja bez fabryce (nie zalecane)

    SimpleIoc.Default.Register<INavigationService>();

  2. Lub jeśli chcesz użyć fabryki, wyrejestrować przed zarejestrowaniem fabrykę

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

  3. zapobiec ViewModelLocator od tworzony więcej niż raz przez projektanta/Mieszanka poprzez konstruktora statycznego

    static ViewModelLocator() { ... }

Błąd jest kłopotliwe, ale może się zdarzyć w tym scenariuszu: możliwość tworzenia obiektów podczas projektowania czasie (ViewModelLocator w aplikacji.prawdopodobnie xaml) i ilekroć zmienisz coś w swoim Kodzie, kompilator jest uruchamiany, a ViewModelLocator jest ponownie tworzony bez konieczności wyrejestrowywania usług. Dlatego też będzie narzekać, że w fabryce została już zarejestrowana. Teoretycznie, przy wielokrotnym rejestrowaniu klas bez fabryk powinien pojawić się błąd.

+1

Druga nie działa dla mnie, ale trzecia zrobiła – Rivenfall

+0

Skończyło się na tym, że mój ViewModelLocator wyglądał tak: http://i.imgur.com/2Ex0rzy.png Po prostu wychodzi z inicjalizacji, na wypadek gdyby VS projektant myśli, że jest to dobry pomysł, aby skonstruować go ponownie w czasie projektowania. Dzięki za wskazówkę! –

Powiązane problemy