When I close a view with a control hosting a region, is the association with the region lost?

34 Views Asked by At

I am creating a module for an application of a foreign application. I'm building a window that will be my main module window. I create a menu and content region. I create a region for Content in the code and it works, but when I close my window and reopen it, I have the impression that the connection between the region and the hosting control disappears. My views seem to work, but they are not presented. If I delete the region and create it again it starts working. Maybe I'm doing something wrong or I don't understand something and I need clarification.

    public class MyModule : IModule
    {
        public static string Name = "Test";
        private readonly IUnityContainer unityContainer;
        private readonly IAppNavigator appNavigator;
        private readonly IShowMessage showMessage;
        private readonly IShellNavigator shellNavigator;

        public MyModule(IUnityContainer unityContainer
            , IShellNavigator shellNavigator
            , IAppNavigator appNavigator
            , IShowMessage showMessage)
        {
            this.unityContainer = unityContainer;
            this.shellNavigator = shellNavigator;
            this.appNavigator = appNavigator;
            this.showMessage = showMessage;
        }

        private string menuHeader = "MyModul";
        private string menuDictionaries = "Słowniki";
        private IRegionManager regionManager;

        public void OnInitialized(IContainerProvider containerProvider)
        { 
            this.regionManager = containerProvider.Resolve<IRegionManager>();
            RegionAdapterMappings regionAdapterMappings = containerProvider.Resolve<RegionAdapterMappings>();
            regionAdapterMappings.RegisterMapping(typeof(AccordionControl), containerProvider.Resolve<DxAccordionControlRegionAdapter>());

            regionManager.RegisterViewWithRegion(RegionNames.AJ_AccordionRegion, typeof(TestModuleMenuView));
            regionManager.RegisterViewWithRegion(RegionNames.AJ_ContentRegion, () => containerProvider.Resolve<ViewA>());
            regionManager.RegisterViewWithRegion(RegionNames.AJ_ContentRegion, typeof(ViewB));

            initializeNavigation();
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterSingleton<IApplicationCommands, Commands.ApplicationCommands>();
            containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>();
            containerRegistry.RegisterForNavigation<ViewB, ViewBViewModel>();
        }

        private void initializeNavigation()
        {
            shellNavigator.AddNavigationItem(nameof(menuDictionaries), menuHeader, menuDictionaries, () => ShowDictionaryViewExecuted(), () => CanExecuteDictionaryView(), () => _loggedOn, 1202);
        }

        private bool CanExecuteDictionaryView()
        {
            return _loggedOn;
        }

        private void ShowDictionaryViewExecuted()
        {
            try
            {
                appNavigator.ShowViewAsync(() => unityContainer.Resolve<DictionariesCardIndexView>(), new OpenViewParams()
                {
                    ViewType = typeof(DictionariesCardIndexView).ToString(),
                    OpenFullScreen = true,
                    OpenMaximized = false,
                    OpenNewIfExists = false,
                    OpenUsingLastFrameParams = true,
                    ProgressDelay = 1,
                    ShowProgressControl = true,
                    //Size = new Size(500, 220)
                    Title = menuDictionaries
                });

            }
            catch (Exception ex)
            {
                showMessage.ShowError(ex.Message);
            }
        }
    }
<UserControl x:Class="Symfonia.PL.PS.RI.HM.Test.Views.DictionariesCardIndexView"
             d:DesignHeight="450" d:DesignWidth="800"
             mc:Ignorable="d">
    <DockPanel>
        <Border Margin="5" DockPanel.Dock="Left" BorderBrush="Black" BorderThickness="1">
            <dxa:AccordionControl Name="AccordionControl"
                                  Width="Auto"
                                  prism:RegionManager.RegionName="{x:Static regions:RegionNames.AJ_AccordionRegion}"
                                  AutoExpandAllItems="True"
                                  ChildrenPath="Items"
                                  CollapsedItemDisplayMode="Content"
                                  CompactNavigation="False"
                                  HeaderContent="{Binding SelectedRootItem.Header, RelativeSource={RelativeSource Self}}"
                                  IsCollapseButtonVisible="False"
                                  SelectedItemChanged="AccordionControl_OnSelectedItemChanged"
                                  SelectedRootItemChanged="AccordionControl_OnSelectedRootItemChanged"
                                  RootItemDisplayMode="Group"
                                  ShowHeader="False"
                                  SelectionUnit="SubItem" 
                                  ViewMode="Accordion"
                                  RootItemExpandButtonPosition="None"
                                  ExpandItemOnHeaderClick="False"
                                   >
            </dxa:AccordionControl>
        </Border>
        <ContentControl x:Name="ContentControl_AJ"/>
    </DockPanel>
</UserControl>
using DevExpress.Xpf.Accordion;
using Prism.Regions;
using Symfonia.PL.PS.RI.HM.Test.Interfaces;
using Symfonia.PL.PS.RI.HM.Test.Navigations;
using Symfonia.PL.PS.RI.HM.Test.ViewModels;
using System.Linq;
using System.Windows;
using System.Windows.Controls;

namespace Symfonia.PL.PS.RI.HM.Test.Views
{
    public partial class DictionariesCardIndexView : UserControl
    {
        private readonly IRegionManager _regionManager;
        private readonly IApplicationCommands _applicationCommands;
        public DictionariesCardIndexView(DictionariesCardIndexViewModel dictionariesCardIndexViewModel, IApplicationCommands applicationCommands,
            IRegionManager regionManager)
        {
            InitializeComponent();
            _applicationCommands = applicationCommands;
            _regionManager = regionManager;
            SetRegionManager(regionManager, this.ContentControl_AJ, Regions.RegionNames.AJ_ContentRegion);
            DataContext = dictionariesCardIndexViewModel;
        }

        void SetRegionManager(IRegionManager regionManager, DependencyObject regionTarget, string regionName)
        {
            //if (regionManager.Regions.ContainsRegionWithName(regionName))
            //{
            //    IRegion region = regionManager.Regions[regionName];
            //    regionManager.Regions.Remove(regionName);
            //}
            RegionManager.SetRegionName(regionTarget, regionName);
            RegionManager.SetRegionManager(regionTarget, regionManager);
        }
    }
}

The article Część 2: Regiony i RegionalManager was helpful, but did not dispel the confusion.

0

There are 0 best solutions below