Blog Archive

Monday, August 11, 2014

Custom Region Adapter

IRegionManager can register view with Region but by default only works for Content Control (single item), ItemsControl (2+ Items)
   <ContentControl Grid.Row="1"  cal:RegionManager.RegionName="{x:Static def:RegionNames.PricingGridRegion}" />
    regMgr.RegisterViewWithRegion("PricingGridRegion", typeof(DurationTraderView));

        <!--<ItemsControl cal:RegionManager.RegionName="{x:Static def:RegionNames.PricingGridRegion}"/>-->

        <StackPanel cal:RegionManager.RegionName="{x:Static def:RegionNames.PricingGridRegion}" Orientation="Horizontal" FlowDirection="RightToLeft" />

Custom Region Adapter is needed to register into Stack Panel:

    public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
    {
        public StackPanelRegionAdapter(RegionBehaviorFactory factory) : base(factory) { }


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

        protected override IRegion CreateRegion()
        {
            return new AllActiveRegion();
          //  return new SingleActiveRegion(); // if onely one item
        }

    }

    public class Module : IModule
    {
        public void Initialize()
        {
            IRegion reg = _regMgr.Regions[RegionNames.PricingGridRegion];
            reg.Add(_container.Resolve<SampleView>());
            reg.Add(_container.Resolve<SampleView>());
            reg.Add(_container.Resolve<SampleView>());
            reg.Add(_container.Resolve<SampleView>());
            reg.Add(_container.Resolve<SampleView>());
        }


No comments: