System.InvalidOperationException: ServiceLocationProvider должен быть установлен в Prism ConfigureContainer () - PullRequest
0 голосов
/ 27 октября 2018

Я новичок в Prism и следую учебному пособию Брайана Лагунаса «Введение в призму». Я создаю собственный регион-адаптер, как показано ниже.

public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
{
    public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehavior )
        :base(regionBehavior)
    {

    }
    protected override void Adapt(IRegion region, StackPanel regionTarget)
    {
        region.Views.CollectionChanged += (s, e) =>
           {
               if(e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
               {
                   foreach(FrameworkElement frameworkElement in e.NewItems)
                   {
                       regionTarget.Children.Add(frameworkElement);
                   }
               }
           };
    }

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

В Bootstrapper

protected override void ConfigureContainer()
{
     RegionAdapterMappings regionAdapterMappings = base.ConfigureRegionAdapterMappings();

     regionAdapterMappings.RegisterMapping(typeof(StackPanel), 
            Container.Resolve<StackPanelRegionAdapter>());
}

Я получаю исключение

System.InvalidOperationException: ServiceLocationProvider должен быть установлен

здесь

RegionAdapterMappings regionAdapterMappings = base.ConfigureRegionAdapterMappings();

Что я делаю неправильно

1 Ответ

0 голосов
/ 27 октября 2018

Вы должны сконфигурировать сопоставления адаптеров вашего региона в переопределении ConfigureRegionAdapterMappings, а не в переопределении ConfigureContainer, которое маскируется под это.

protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
    var regionAdapterMappings = base.ConfigureRegionAdapterMappings();
    regionAdapterMappings.RegisterMapping(typeof(StackPanel), ServiceLocator.Current.GetInstance<StackPanelRegionAdapter>());
    return regionAdapterMappings;
} 

Подсказка: вы получите исключение, потому что ConfigureContainer вызывается до ConfigureServiceLocator и base.ConfigureRegionAdapterMappings использует ServiceLocator.Current.

...