Для неконтекстных вкладок моим любимым подходом к этой проблеме является динамическая загрузка компонентов (например, через отражение), которые включают в себя XAML с привязкой к командам и виртуальным машинам (или контроллерам), которые включают в себя реализации команд и выполняют эти командные привязки ,
Для контекстных вкладок мой любимый подход состоит в том, чтобы включить словарь для сопоставлений Model to ViewModel, а затем активировать/деактивировать контекстные вкладки по имени, которые были загружены с использованием вышеуказанного подхода (и передать им правильный контекст данных - представление модель).
Псевдо код должен быть больше или меньше, как это (в зависимости от того, что ваши рамки осуществления и то, что вы должны реализовать себя):
// Deserialize UI controllers from configuration files
// Each controller should act as view-model for its UI elements
// Register controllers with UI Manager
foreach controller in config.UiControllers uiManager.AddController(controller);
void UiManager.AddController(UiController controller)
{
// Load controller's tool windows
foreach toolWindow in contoller.toolWindows
{
toolWindow.LoadResources();
toolWindow.DataContext = controller;
mainWindow.AddToolWindow(toolWindow, contoller.PreferedUiRegion);
}
// Load controller's toolbars
foreach toolBar in controller.ToolBars
{
toolBar.DataContext = controller;
mainWindow.AddToolBar(toolBar);
}
// Load controller's contextual toolbar groups
foreach group in controller.ContextualToolBarGroups
{
group.DataContext = controller;
mainWindow.AddContextualToolBarGroupr(group);
}
// Load view models for specific model types
foreach item in controller.ViewModelsDictionary
{
this.RegisterViewModelType(item.ModelType, item.ViewModelType, item.ViewType);
}
}
void UiManager.OnItemSelected(Object selectedItem)
{
var viewModelType = GetViewModelTypeFromDictionary(selectedItem);
var viewType = GetViewTypeFromDictionary(selectedItem) ?? typeof(ContentPresentor);
var viewModel = Reflect.CreateObject(viewModelType);
var view = Reflection.CreateObject(viewType);
viewModel.Model = selectItem;
view.DataContext = viewModel;
// Enable activation of contextual tab group on activate of view (if user clicks on it)
view.OnActivatedCommandParameter = viewModel.ContextualTabGroupName;
// This command should ask mainWindow to find contextual tab group, by name, and activate it
view.OnActivatedCommand = ModelActivatedCommand;
mainWindow.DocumentArea.Content = view;
}
Спасибо за ответ. Можете ли вы представить для него небольшой пример кода? – Lari13
Код зависит от используемых вами фреймворков, однако я мог бы добавить пример псевдокода. –
Я использую PrismV4 с MEF. Я думаю, что код pesudo тоже в порядке :) Спасибо – Lari13