2016-11-13 10 views
0

Я реализовал пользовательский адаптер области для ToolBar, как описано в этой ссылке 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() метод в моем загрузчике (мой Bootstrapper наследует от MefBootstrapper). Вот код:

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

Когда я компилирую, я получаю эту ошибку: «ToolBarRegionAdapter» не содержит конструктор, который принимает 0 аргументов. Что на самом деле верно, contructor принимает IRegionBehaviorFactory, но у меня нет этого объекта в моем коде. Но в примерах, которые я видел, адаптер области создается без каких-либо аргументов. Любая идея почему? Благодаря!

ответ

1

Хотя инъекции конструктора всегда предпочтительнее, когда это не представляется возможным, так как в вашем случае, пойти на локатор ...

ServiceLocator.Current.GetInstance<IRegionBehaviorFactory >() 

... как показан в ссылке вы предоставили, кстати. ..

+0

Благодаря @Haukinger. Это сработало. Однако я не понимаю здесь некоторых бит и моментов (извините, я довольно новичок в Prism). ** Вопрос 1 **: ServiceLocator - это «поле», где вы можете получить экземпляры каких объектов? ; ** Вопрос 2 **: Что такое «инъекция конструктора» ?; и ** Вопрос 3 **: «Почему инъекция конструктора невозможна в моем случае? – chincheta73

+0

ad 1) вид, да, призму настраивает общий сервисный локатор для доступа к используемому контейнеру, так что это то же самое, что« Container.Resolve '. ad 2) средство впрыска конструктора, имеющее зависимости как параметры конструктора и заполняющий их контейнер при разрешении. ad 3) впрыск конструктора возможен только, если конструктор вызывается контейнером, то есть, если экземпляр создается с помощью' Container.Resolve' – Haukinger

+0

FYI, не используйте 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 », и не может быть найден метод расширения« Resolve », принимающий первый аргумент типа CompositionContainer« ... – chincheta73

 Смежные вопросы

  • Нет связанных вопросов^_^