2013-07-11 70 views
7

我試圖將我自己製作的MVVM實現中的WP8項目調整爲MVVM Light。MVVM-light已經有一家工廠註冊了INavigationService

應用程序編譯沒有錯誤,但是當我在Expression Blend中打開我的MainPage.xaml中,我會得到這個錯誤:

類project.Services.INavigationService已經被註冊。 App.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的地方沒有其他地方,那麼可能是什麼問題?

任何想法? :)

回答

0

現在可能已經解決了,但我認爲你可以通過不使用工廠方法覆蓋來解決您的示例中的問題。

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

如果你確實需要一個工廠方法,那麼您可以在使用設計模式支票喜歡你是你的工廠方法的方法混合這條線。

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

這似乎是一個超級老問題,但谷歌上搜索了幾個小時之後,這是這是類似我的問題,所以在這裏回答爲其他人只是時間問題。

請確保您有IsDataSource您ViewModelLocator:

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

這解決了我的問題,我的設計數據彈出通俗易懂。

奇怪的是,所有我的「INavigationService已經註冊」錯誤消失了!

10

我有同樣的問題,這似乎是與XAML設計器,靜態工廠/定位器和對象的設計時創建組合的Visual Studio問題。但是:該解決方案有以下幾條:

  1. 註冊無工廠(不推薦)

    SimpleIoc.Default.Register<INavigationService>();

  2. 或者,如果你想註冊的工廠

    前使用一個工廠,註銷

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

  3. 。防止ViewModelLocator從通過使構造靜態創建不是由設計師/混合一次

    static ViewModelLocator() { ... }

的錯誤是很麻煩,但可能發生在這種情況:你創建在設計時對象(應用程序內的ViewModelLocator。xaml可能),並且無論何時您更改代碼中的某些內容,編譯器都會被觸發,並且ViewModelLocator會被重新創建而不會註銷服務。因此它會抱怨在工廠裏已經註冊了。理論上,多次註冊無工廠類時,應該有一個錯誤。

+1

第二個沒有爲我工作,但第三個沒有 – Rivenfall

+0

我最終使我的ViewModelLocator看起來像這樣:http://i.imgur.com/2Ex0rzy.png只需退出初始化,以防VS設計師認爲在設計時再次構建它是一個好主意。感謝指針! –

相關問題