Пользовательский регион адаптер (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;
}
Другие вопросы по тегам