2016-11-13 29 views
0

私は、このリンクhttp://compositewpf.codeplex.com/discussions/250892で説明されているように、ツールバーのカスタム領域アダプタを実装しました。私はこのエラーが発生します: 'ToolBarRegionAdapter'に0引数を取るコンストラクタが含まれていません。ここ 私のコード:カスタム領域アダプタ(PRISM)

public class ToolBarRegionAdapter : RegionAdapterBase<ToolBar> 
{ 
    public ToolBarRegionAdapter(IRegionBehaviorFactory behaviorFactory) 
     : base(behaviorFactory) 
    { 
    } 

    protected override IRegion CreateRegion() 
    { 
     return new AllActiveRegion(); 
    } 

    protected override void Adapt(IRegion region, ToolBar regionTarget) 
    { 
     region.Views.CollectionChanged += (sender, e) => 
     { 
      switch (e.Action) 
      { 
       case NotifyCollectionChangedAction.Add: 
        foreach (FrameworkElement element in e.NewItems) 
        { 
         regionTarget.Items.Add(element); 
        } 
        break; 

       case NotifyCollectionChangedAction.Remove: 
        foreach (UIElement elementLoopVariable in e.OldItems) 
        { 
         var element = elementLoopVariable; 
         if (regionTarget.Items.Contains(element)) 
         { 
          regionTarget.Items.Remove(element); 
         } 
        } 
        break; 
      } 
     }; 
    } 
} 

私は私のブートストラップでConfigureRegionAdapterMappings()メソッドを(私のブートストラップがMefBootstrapperから継承)オーバーライドしています。ここでのコード:「ToolBarRegionAdapterは」0引数を取るコンストラクタが含まれていません:

protected override RegionAdapterMappings ConfigureRegionAdapterMappings() 
{ 
    RegionAdapterMappings regionAdapterMappings = base.ConfigureRegionAdapterMappings(); 
    regionAdapterMappings.RegisterMapping(typeof(ToolBar), new ToolBarRegionAdapter()); 
    return regionAdapterMappings; 
} 

私はこのエラーを取得するコンパイル。実際には真実ですが、コンストラクタはIRegionBehaviorFactoryをとりますが、私のコードにそのオブジェクトはありません。しかし、私が見た例では、リージョン・アダプターは引数なしでインスタンス化されています。 理由は何ですか?ありがとう!

答えて

1

それが不可能なとき、コンストラクタ・インジェクションは、常にあなたの場合のように、サービスロケータのために行く、好ましいが...

ServiceLocator.Current.GetInstance<IRegionBehaviorFactory >() 

...あなたはところで、提供されたリンクのようになります。 ..

+0

おかげ@Haukingerでなければなりません。出来た。しかし、私はここでいくつかのビットとpeacesを理解していない(申し訳ありません、私は非常にプリズムに新しいです)。 **質問1 **:ServiceLocatorは、どのような種類のオブジェクトのインスタンスを取得できる「ボックス」ですか? ; **質問2 **: "コンストラクタインジェクション"とは何ですか? **質問3 **:なぜ私のケースでコンストラクタインジェクションができないのですか? – chincheta73

+0

広告1)kind-of、yes、prismは、使用されるコンテナにアクセスするための共通サービスロケータを設定します。したがって、Container.Resolve '。ad 2)コンストラクタインジェクションとは、コンストラクタパラメータとして依存関係を持つことを意味し、コンポーネントはコンポーネントがコンポーネントによって呼び出された場合にのみコンテナが呼び出されます。ad 3) Container.Resolve' – Haukinger

+0

ServcieLocatorを使用しないでください。直接コンテナを使用してください。http://brianlagunas.com/create-a-custom-prism-regionadapter/ –

0

あなたは、アダプタを追加する方法と間違っている:

protected override RegionAdapterMappings ConfigureRegionAdapterMappings() 
{ 
    RegionAdapterMappings regionAdapterMappings = base.ConfigureRegionAdapterMappings(); 
    regionAdapterMappings.RegisterMapping(typeof(ToolBar), Container.Resolve<ToolBarRegionAdapter>()); 
    return regionAdapterMappings; 
} 
+0

アダプターを追加すると、このエラーが発生します。 "CompositionContainerには 'Resolve'の定義が含まれておらず、CompositionContainerタイプの最初の引数を受け入れる拡張メソッド 'Resolve'が見つかりませんでした。" – chincheta73

関連する問題