Проблемы с зависимостью модуля и eventAggregator при загрузке модуля в призму C#

Я использую призму с C# там у меня проблема с загрузкой двух модулей. В модуле A есть TabControl с ItemTemplate и ContentTemplate. Модуль B является подпредставлением модуля A и находится в шаблоне содержимого модуля A.

Xaml модуля A

<Grid>
    <TabControl x:Name="tabControl" ItemsSource="{Binding Folders}" SelectedItem="{Binding SelectedItem}" HorizontalAlignment="Stretch"  VerticalAlignment="Stretch">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <ContentControl prism:RegionManager.RegionName="ListModulRegion" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
</Grid>

ViewModel модуля A

В ViewModel модуля A находится EventAggregator. Которые публикуют событие, когда выбран другой элемент в TabControll.

    #region Private Fields **************************************************************************************************

    private readonly IDeviceService _deviceService;
    private readonly IEventAggregator _eventAggregator;

    private ModuleFolder _selectedItem;
    #endregion

    #region Public Properties ***********************************************************************************************

    public IEnumerable<ModuleFolder> Folders
    {
        get
        {
            return _deviceService.ModuleFolders;
        }
    }

    public ModuleFolder SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            OnPropertyChanged(() => SelectedItem);
            ModuleFolderChangeEvent evt = _eventAggregator.GetEvent<ModuleFolderChangeEvent>();
            evt.Publish(SelectedItem);
        }
    }
    #endregion

    #region Constructor(s) **************************************************************************************************

    public FolderSelectionViewModel(IEventAggregator eventAggregator, IDeviceService deviceService)
    {
        _eventAggregator = eventAggregator;

        _deviceService = deviceService;
        if(_deviceService.ModuleFolders.Count>0)
        {
            SelectedItem = _deviceService.ModuleFolders[0];
        }
    }

ViewModel модуля B

В ViewModel модуля B eventAggregator подписывается на это событие.

    #region Private Fields **************************************************************************************************
    private ModuleFolder _currentFolder;
    private readonly IEventAggregator _eventAggregator;
    private readonly IDeviceService _deviceService;
    private readonly IUiDispatcher _uiDispatcher;

    private ObservableCollection<ModuleViewModel> _observableModules;
    private ModuleViewModel _selectedListItem;
    #endregion

    #region Public Properties ***********************************************************************************************

    public ObservableCollection<ModuleViewModel> ObservableModules
    {
        get
        {
            return (_observableModules);
        }
        set
        {
            _observableModules = value;
            OnPropertyChanged(() => ObservableModules);
        }
    }

    public ModuleViewModel SelectedListItem
    {
        get { return _selectedListItem; }
        set
        {
            _selectedListItem = value;
            OnPropertyChanged(() => SelectedListItem);
        }
    }
    #endregion

    #region Constructor(s) **************************************************************************************************

    public ModuleListViewModel(IEventAggregator eventAggregator, IUiDispatcher uiDispatcher, IDeviceService deviceService)
    {
        ModuleFolderChangeEvent evt = eventAggregator.GetEvent<ModuleFolderChangeEvent>();
        evt.Subscribe(OnMailFolderChanged);

        _eventAggregator = eventAggregator;
        _uiDispatcher = uiDispatcher;
        _deviceService = deviceService;

        PropertyChanged += ModuleListSelectionViewModel_PropertyChanged;
    }
    #endregion

загрузчик

В Bootsrapper модуль A зависит от модуля B.

    protected override void ConfigureModuleCatalog()
    {
        base.ConfigureModuleCatalog();

        ModuleCatalog moduleCatalog = (ModuleCatalog) ModuleCatalog;

        //Communication
        Type serviceModule = typeof(CommunicationModule);
        moduleCatalog.AddModule(serviceModule);

        //Device List
        Type deviceListUiModule = typeof(DeviceListModule);
        System.Collections.ObjectModel.Collection<string> dependsDeviceListUi = new System.Collections.ObjectModel.Collection<string>
        {
            serviceModule.Name
        };

        moduleCatalog.AddModule(new ModuleInfo
        {
            ModuleName = deviceListUiModule.Name,
            ModuleType = deviceListUiModule.AssemblyQualifiedName,
            DependsOn = dependsDeviceListUi,
        });

        //Tap Region
        Type selectionUiModule = typeof (SelectionModule);
        System.Collections.ObjectModel.Collection<string> dependsSelectionUi = new System.Collections.ObjectModel.Collection<string>
        {
            serviceModule.Name,
            deviceListUiModule.Name
        };

        moduleCatalog.AddModule(new ModuleInfo
        {
            ModuleName = selectionUiModule.Name,
            ModuleType = selectionUiModule.AssemblyQualifiedName,
            DependsOn = dependsSelectionUi
        });
    }

Эта проблема

Когда модуль А загружен. Первый элемент выбран и опубликовать событие. Но модуль B не загружен подпиской на опоздание на событие пропуска первой публикации. Во второй раз, когда загружен модуль B, все работает нормально.

Я читал о том, как контролировать порядок инициализации модуля в Prism. Но, возможно, есть другой способ или лучший способ сделать это. Потому что я новичок в призме, и сейчас я не лучший способ сделать это.

Извините за мой плохой английский.:-(

1 ответ

В процессе начальной загрузки убедитесь, что "ModuleB" загружается и инициализируется перед "ModuleA".

Другие вопросы по тегам