2015-09-30 5 views
0

i Использование призмы с C# a там у меня проблема с нагрузкой двух модулей. В модуле A находится TabControl с ItemTemplate и ContentTemplate. Модуль B представляет собой подвид модуля А и в ContentTemplate из модуля А.Проблемы с зависимостью модуля и eventAggregator от нагрузки модуля в C# призме

Xaml в модуле А

<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 в модуле А

В ViewModel модуля A является агрегирующим событием. Публикация события, когда выбран другой элемент в 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 является subscribte к этому событию.

#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 зависит от МОДУЛЬ 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, все работает отлично.

Я прочитал о How to control the order of module initialization in Prism. Но, возможно, есть другой способ или лучший способ сделать это. Потому что я новичок в призме, и теперь я не лучший способ это сделать.

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

ответ

0

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

+0

Как я могу это сделать? Поскольку модуль B является список устройств, которые добавляют до модуля A (Tab Регион). И есть также зависимость. – ascholz