Пользовательский регион адаптер (PRISM)
Я реализовал специальный адаптер региона для панели инструментов, как описано в этой ссылке http://compositewpf.codeplex.com/discussions/250892. Я получаю эту ошибку: "ToolBarRegionAdapter" не содержит конструктор, который принимает 0 аргументов. Вот мой код:
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 (мой Bootstrapper наследуется от MefBootstrapper). Вот код:
protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
RegionAdapterMappings regionAdapterMappings = base.ConfigureRegionAdapterMappings();
regionAdapterMappings.RegisterMapping(typeof(ToolBar), new ToolBarRegionAdapter());
return regionAdapterMappings;
}
Когда я компилирую, я получаю эту ошибку: "ToolBarRegionAdapter" не содержит конструктор, который принимает 0 аргументов. Что на самом деле верно, конструктор принимает IRegionBehaviorFactory, но у меня нет этого объекта в моем коде. Но в примерах, которые я видел, адаптер региона создается без каких-либо аргументов. Есть идеи почему? Спасибо!
2 ответа
Хотя внедрение конструктора всегда предпочтительнее, когда это невозможно, как в вашем случае, воспользуйтесь указателем службы...
ServiceLocator.Current.GetInstance<IRegionBehaviorFactory >()
... как показано в ссылке, которую вы предоставили, кстати...
Вы не правы в том, как вы добавляете адаптер:
Должно быть
protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
RegionAdapterMappings regionAdapterMappings = base.ConfigureRegionAdapterMappings();
regionAdapterMappings.RegisterMapping(typeof(ToolBar), Container.Resolve<ToolBarRegionAdapter>());
return regionAdapterMappings;
}