2013-07-11 18 views
7

Sto provando ad adattare il mio progetto WP8 dall'implementazione MVVM fatta da sé a MVVM Light.MVVM-light Esiste già una fabbrica registrata per INavigationService

L'applicazione compila senza errori, ma quando apro il mio MainPage.xaml in Expression Blend, io ottenere questo errore:

Classe project.Services.INavigationService è già registrato. App.xaml

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

Come si può vedere dal mio commento codice, ho già provato la correzione presunto qui, ma sto ancora ricevendo questo errore in Blend. Non c'è altro posto dove poter registrare l'INavigationService, quindi quale potrebbe essere il problema?

Qualche idea? :)

risposta

0

Potrebbe già essere risolto, ma penso che puoi risolvere il problema nel tuo caso esemplificativo non utilizzando il metodo di sostituzione predefinito.

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

Se avete bisogno di un metodo factory, allora si può mescolare questa linea con il tuo fabbrica approccio metodo che utilizza il controllo di modalità di progettazione come siete stati.

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

questa sembra una domanda super vecchio, ma dopo ore di googling, questa è l'unica domanda che è simile al mio problema, in modo da rispondere qui per altre persone.

Assicurarsi di avere IsDataSource sul ViewModelLocator:

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

che ha risolto il mio problema e miei dati di progettazione spuntato immediatamente.

Stranamente, dopo averlo acceso, tutti i miei errori "INavigationService sono già registrati" vanno via!

10

Ho avuto lo stesso problema e questo sembra essere un problema di Visual Studio in combinazione con XAML-Designer, Fabbriche/Localizzatori statici e Creazione di oggetti in fase di progettazione. Tuttavia: Le soluzioni sono state le seguenti:

  1. Registrati senza una fabbrica (non raccomandato)

    SimpleIoc.Default.Register<INavigationService>();

  2. Oppure, se si desidera utilizzare una fabbrica, annullare la registrazione prima di registrare la fabbrica

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

  3. Impedire l'ViewModelLocator venga creato più di una volta dal progettista/Miscela facendo il costruttore statico

    static ViewModelLocator() { ... }

L'errore è ingombrante, ma potrebbe accadere in questo scenario: Si crea oggetti durante fase di progettazione (lo ViewModelLocator all'interno dell'app.probabilmente xaml) e ogni volta che si modifica qualcosa nel codice, il compilatore viene attivato e ViewModelLocator viene ricreato senza mai annullare la registrazione dei servizi. Pertanto si lamenterà che in fabbrica è già stato registrato. In teoria, quando si registrano più classi senza factory più volte, dovrebbe esserci un errore.

+1

2 ° non ha funzionato per me, ma il 3 ° ha fatto – Rivenfall

+0

Ho finito per rendere il mio ViewModelLocator simile a questo: http://i.imgur.com/2Ex0rzy.png Esce semplicemente dall'inizializzazione, nel caso in cui il VS il progettista pensa che sia una buona idea costruirlo di nuovo in fase di progettazione. Grazie per il puntatore! –