2012-07-13 67 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