2012-07-13 47 views
0

我有一個相當簡單和標準的MVVM WPF應用程序。我使用TinyIoC作爲包含器,爲ViewModels提供底層數據和緩存提供程序。我正在使用TinyIoC,因爲我想與MonoTouch和Monodroid項目共享此代碼。WPF設計器加載失敗使用IoC

ViewModel的每個用戶控件都不依賴於從TinyIoC解析數據提供者時添加到MainWindow的XAML時工作正常。

是誰的ViewModels是否正在使用TinyIoC來解決所使用的數據提供用戶控制得到他們的數據,不能在設計視圖時添加到主窗口被實例化。

重要注意事項:當我運行應用程序時,一切正常,只是設計師被破壞 - 一個很大的障礙。

以下是基本代碼:

// From App.xaml.cs 
    private void HandleAppStartupEvent(object sender, StartupEventArgs e) { 
     IDataStoreProvider store = new XmlDataStoreProvider(); 
     ICacheProvider cache = new DictionaryCacheProvider(); 

     TinyIoCContainer.Current.Register(store); 
     TinyIoCContainer.Current.Register(cache); 
    } 

查看/視圖模型/ XAML約束力的標準執行 - 這裏沒有任何的問題。

在數據層的深處,IoC容器用於解析使用哪個提供者 - 在上面的代碼中設置的提供者。

public static class Gateway 
{ 
    private static IDataStoreProvider store; 
    private static ICacheProvider cache; 

    static Gateway() { 
     store = TinyIoCContainer.Current.Resolve<IDataStoreProvider>(); 
     cache = TinyIoCContainer.Current.Resolve<ICacheProvider>(); 
    } 

    // use the store and cache here... 

} 

這是我從設計師那裏得到的確切的錯誤。

無法解析類型:在TinyIoC.TinyIoCContainer.ResolveInternal(TypeRegistration註冊,NamedParameterOverloads參數,ResolveOptions選項)用C Sample.Core.Data.IDataStoreProvider :_dev \ SAMPLE \ SampleSolution \ Sample.Core \實用\ TinyIoC.cs:line 3281 at TinyIoC.TinyIoCContainer.Resolve(Type resolveType)in C:_dev \ Sample \ SampleSolution \ Sample.Core \ Utility \ TinyIoC.cs:line 1314 at TinyIoC.TinyIoCContainer.ResolveResolveType in C:_dev \ Sample \ SampleSolution \ Sample.Core \ Utility \ TinyIoC.cs:line 1433 at Sample.Core.Data.Gateway..cctor()in C:_dev \ Sample \ SampleSolution \ Sample.Core \ Data \ Gateway.cs:line 14

我想我明白爲什麼我得到這個錯誤 - 應用程序啓動事件不激發設計師加載之前加載國際奧委會和執行主窗口中用戶控件。

同樣重要的是要注意,應用程序工作正常 - 國際奧委會和一切。我想停下來無論是設計師加載錯誤(按優先順序排列):

  • 瞭解如何修改代碼以正確地與設計師
  • 存根與模擬數據的現有控制數據工作設計師
  • 禁用此設計者特徵
+0

您是否嘗試過使用MVVM架構? – 2012-07-13 22:03:30

+0

是的 - 這是MVVM – IUnknown 2012-07-13 22:07:11

回答

0

你試圖加載在事件處理程序的數據爲您的Windows /容器裝載事件?這樣做在過去造成了這種類型的問題。

+0

我也嘗試在構造函數中,但也有同樣的問題。我正在尋找一個地方,我可以初始化也將工作設計器的容器。 – IUnknown 2012-07-13 18:58:39

0

這裏(爲設計師存根與模擬數據的現有控制數據)的第二顆子彈的解決方案

下面的代碼添加到視圖模型構造:

public AdminViewModel(UserControl view) { 
     this.view = view; 

     var designMode = DesignerProperties.GetIsInDesignMode(view); 

     if (designMode) { 
      Items = new ObservableCollection<ItemModel> 
         {new ItemModel {Name = "Item1"}, 
         new ItemModel {Name = "Item2"}}; 
     } 
     else { 
      Items= new ObservableCollection<ItemModel>(Gateway.GetItems()); 
     } 
    } 

雖然作品,我有一對夫婦的擔憂:

  • 污染與非應用程序邏輯的代碼
  • 迫使我傳球的參考對ViewModel的看法

我寧願讓這個更「混合」,設計師友好更清潔的方式 - 任何其他的想法?

+0

如果這是你自己問題的完整答案,那麼比這個答案好。否則,最好用這些信息更新你的問題(特別是因爲這個答案再次包含一個問題),並刪除這個答案。 – Steven 2012-07-14 11:34:43