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. Но, возможно, есть другой способ или лучший способ сделать это. Потому что я новичок в призме, и теперь я не лучший способ это сделать.
Извините за мой плохой английский. :-(
Как я могу это сделать? Поскольку модуль B является список устройств, которые добавляют до модуля A (Tab Регион). И есть также зависимость. – ascholz