2016-11-13 6 views
0

이 링크 http://compositewpf.codeplex.com/discussions/250892에서 설명한대로 도구 모음에 대한 사용자 지정 지역 어댑터를 구현했습니다. 이 오류가 발생합니다 : 'ToolBarRegionAdapter'0 인수를 사용하는 생성자가 포함되어 있지 않습니다. 여기 내 코드 : 내 부트 스트 래퍼에() 메소드를 ConfigureRegionAdapterMappings를 오버라이드 한사용자 지정 영역 어댑터 (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; 
      } 
     }; 
    } 
} 

는 (내 부트 스트 래퍼는 MefBootstrapper에서 상속). 여기에 코드 : 'ToolBarRegionAdapter는'0 인수를 취하는 생성자가 포함되어 있지 않습니다

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

나는이 오류가 컴파일

. 실제로 사실입니다. 생성자는 IRegionBehaviorFactory를 사용하지만 코드에 해당 객체가 없습니다. 그러나 본 예제에서 영역 어댑터는 아무런 논쟁없이 인스턴스화됩니다. 그 이유는 무엇입니까? 감사! 생성자 주입은 항상 바람직하지만 그것이 불가능 할 때 제공 한 링크에 도시 된 바와 같이

답변

1

, 귀하의 경우와 같이, BTW, ... 서비스 로케이터에 대한

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