Miro,
No problem, but I will have to say that after looking at your solution I have gone back and reworked mine. For whatever reason it never dawned on me to create a RadRibbonTab view and add it to the RibbonBarRegion. I basically took what you had and what I had and combined them and have a solution I am much happier with. Only thing that doesn't really work that would be nice is design time support for a RadRibbonTab, but this is easy enough to work around. I simply create a test window create my RadRibbonBar there and once I have my tabs and groups looking the way I want I simply copy and paste.
Also I have not tried to combine tabs or add items from one module to a global Home or Settings Tab, but I really haven't had the need yet either. So in other words with this new solution I still have one tab for each module.
Here is a snippet from one of my modules.
View
<telerikRibbonBar:RadRibbonTab x:Class="EliteExtender.Security.Views.RibbonTabView"
xmlns:telerikRibbonBar="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.RibbonBar"
xmlns:telerik="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" Header="{Binding TabHeader}">
<telerikRibbonBar:RadRibbonGroup Header="{Binding SecurityGroupHeader}">
<telerikRibbonBar:RadRibbonButton Command="{Binding ManageUsersCommand}">
<StackPanel Orientation="Vertical">
<Image Source="{Binding ManageUsersButtonIcon}" Margin="0,0,5,0" Width="24" Height="24"/>
<TextBlock Text="{Binding ManageUsersButtonText}"/>
</StackPanel>
</telerikRibbonBar:RadRibbonButton>
<telerikRibbonBar:Separator/>
<telerikRibbonBar:RadRibbonButton Command="{Binding ManageRolesCommand}">
<StackPanel Orientation="Vertical">
<Image Source="{Binding ManageRolesButtonIcon}" Margin="0,0,5,0" Width="24" Height="24"/>
<TextBlock Text="{Binding ManageRolesButtonText}"/>
</StackPanel>
</telerikRibbonBar:RadRibbonButton>
<telerikRibbonBar:Separator/>
<telerikRibbonBar:RadRibbonButton Command="{Binding ManagePermissionsCommand}">
<StackPanel Orientation="Vertical">
<Image Source="{Binding ManagePermissionsButtonIcon}" Margin="0,0,5,0" Width="24" Height="24"/>
<TextBlock Text="{Binding ManagePermissionsButtonText}"/>
</StackPanel>
</telerikRibbonBar:RadRibbonButton>
</telerikRibbonBar:RadRibbonGroup>
<telerikRibbonBar:RadRibbonGroup Header="{Binding RulesGroupHeader}">
<telerikRibbonBar:RadRibbonButton Command="{Binding BuildRulesCommand}" Size="Large">
<StackPanel Orientation="Vertical">
<Image Source="{Binding BuildRulesButtonIcon}" Margin="0,0,5,0" Width="24" Height="24"/>
<TextBlock Text="{Binding BuildRulesButtonText}" TextWrapping="Wrap"/>
</StackPanel>
</telerikRibbonBar:RadRibbonButton>
<telerikRibbonBar:Separator/>
<telerikRibbonBar:RadRibbonButton Command="{Binding CleanRulesCommand}" Size="Large">
<StackPanel Orientation="Vertical">
<Image Source="{Binding CleanRulesButtonIcon}" Margin="0,0,5,0" Width="24" Height="24"/>
<TextBlock Text="{Binding CleanRulesButtonText}" TextWrapping="Wrap"/>
</StackPanel>
</telerikRibbonBar:RadRibbonButton>
</telerikRibbonBar:RadRibbonGroup>
</telerikRibbonBar:RadRibbonTab>
ViewModel
using System.ComponentModel;
using System.Windows.Input;
using System.Windows.Media.Imaging;
using EliteExtender.Composite.Extensions;
using EliteExtender.Composite.Extensions.ViewModels;
using EliteExtender.Infrastructure.Security;
using EliteExtender.Infrastructure.Services;
using EliteExtender.Security.Properties;
using EliteExtender.Security.Views;
using EliteExtender.Synchronization.Database;
using Microsoft.Practices.Composite.Events;
using Microsoft.Practices.Composite.Regions;
using Microsoft.Practices.Unity;
using EliteExtender.Security.Domain;
namespace EliteExtender.Security.ViewModels
{
internal class RibbonTabViewModel : ViewModelBase<IRibbonTabView>
{
private readonly IUnityContainer container;
private readonly IEventAggregator aggregator;
private readonly IRegionManager regionManager;
private readonly EliteExtenderAuthorizationRuleProvider ruleProvider;
DBSynchronization dbSync;
private readonly DelegateCommand manageRolesCommand;
private readonly DelegateCommand manageUsersCommand;
private readonly DelegateCommand managePermissionsCommand;
private readonly DelegateCommand buildRulesCommand;
private readonly DelegateCommand cleanRulesCommand;
ManageUsersViewModel presentationManageUsersModel;
ManageRolesViewModel presentationManageRolesModel;
ManagePermissionsViewModel presentationManagePermissionsModel;
public RibbonTabViewModel(IUnityContainer container, IRibbonTabView view, IEventAggregator aggregator, DBSynchronization dbSync, EliteExtenderAuthorizationRuleProvider ruleProvider)
: base(view)
{
this.container = container;
this.aggregator = aggregator;
this.dbSync = dbSync;
this.ruleProvider = ruleProvider;
//Subscribe to DBSync change events
//dbSync.PropertyChanged += new PropertyChangedEventHandler(dbSync_PropertyChanged);
//Commands
this.manageRolesCommand = new DelegateCommand(OnManageRolesExecute, CanManageRolesExecute);
this.manageUsersCommand = new DelegateCommand(OnManageUsersExecute, CanManageUsersExecute);
this.managePermissionsCommand = new DelegateCommand(OnManagePermissionsExecute, CanManagePermissionsExecute);
this.buildRulesCommand = new DelegateCommand(OnBuildRulesExecute, CanBuildRulesExecute);
this.cleanRulesCommand = new DelegateCommand(OnCleanRulesExecute, CanCleanRulesExecute);
//ViewModels
}
public string TabHeader
{
get { return Properties.Resources.ModuleTitle; }
}
public string SecurityGroupHeader
{
get { return Properties.Resources.ManageSecurity; }
}
public string RulesGroupHeader
{
get { return Properties.Resources.ManageRules; }
}
public string ManageUsersButtonText
{
get { return Resources.ManageUsers; }
}
public BitmapImage ManageUsersButtonIcon
{
get
{
return new BitmapImage(ResourceService.GetPackUri("Resources/Users.png"));
}
}
public string ManageRolesButtonText
{
get { return Resources.ManageRoles; }
}
public BitmapImage ManageRolesButtonIcon
{
get
{
return new BitmapImage(ResourceService.GetPackUri("Resources/Roles.png"));
}
}
public string ManagePermissionsButtonText
{
get { return Resources.ManageRoles; }
}
public BitmapImage ManagePermissionsButtonIcon
{
get
{
return new BitmapImage(ResourceService.GetPackUri("Resources/Permissions.png"));
}
}
public string BuildRulesButtonText
{
get { return Resources.BuildRules; }
}
public BitmapImage BuildRulesButtonIcon
{
get
{
return new BitmapImage(ResourceService.GetPackUri("Resources/BuildRules.png"));
}
}
public string CleanRulesButtonText
{
get { return Resources.CleanRules; }
}
public BitmapImage CleanRulesButtonIcon
{
get
{
return new BitmapImage(ResourceService.GetPackUri("Resources/CleanRules.png"));
}
}
public ICommand ManageRolesCommand { get { return manageRolesCommand; } }
private bool CanManageRolesExecute()
{
return ruleProvider.Authorized(RuleList.ManageRoles);
}
private void OnManageRolesExecute()
{
if (presentationManageRolesModel == null)
{
presentationManageRolesModel = container.Resolve<ManageRolesViewModel>();
}
presentationManageRolesModel.Launch();
}
public ICommand ManageUsersCommand { get { return manageUsersCommand; } }
private bool CanManageUsersExecute()
{
return ruleProvider.Authorized(RuleList.ManageUsers);
}
private void OnManageUsersExecute()
{
if (presentationManageUsersModel == null)
{
presentationManageUsersModel = container.Resolve<ManageUsersViewModel>();
}
presentationManageUsersModel.Launch();
}
public ICommand ManagePermissionsCommand { get { return managePermissionsCommand; } }
private bool CanManagePermissionsExecute()
{
return ruleProvider.Authorized(RuleList.ManagePermissions);
}
private void OnManagePermissionsExecute()
{
if (presentationManagePermissionsModel == null)
{
presentationManagePermissionsModel = container.Resolve<ManagePermissionsViewModel>();
}
presentationManagePermissionsModel.Launch();
}
public ICommand BuildRulesCommand { get { return buildRulesCommand; } }
private bool CanBuildRulesExecute()
{
return ruleProvider.Authorized(RuleList.BuildRules);
}
private void OnBuildRulesExecute()
{
if (presentationManagePermissionsModel == null)
{
presentationManagePermissionsModel = container.Resolve<ManagePermissionsViewModel>();
}
presentationManagePermissionsModel.BuildRules();
}
public ICommand CleanRulesCommand { get { return cleanRulesCommand; } }
private bool CanCleanRulesExecute()
{
return ruleProvider.Authorized(RuleList.CleanRules);
}
private void OnCleanRulesExecute()
{
if (presentationManagePermissionsModel == null)
{
presentationManagePermissionsModel = container.Resolve<ManagePermissionsViewModel>();
}
presentationManagePermissionsModel.CleanRules();
}
}
}
ModuleController (wireup code)
using EliteExtender.Infrastructure;
using EliteExtender.Infrastructure.Factories;
using EliteExtender.Security.ViewModels;
using EliteExtender.Security.Views;
using Microsoft.Practices.Composite.Regions;
using Microsoft.Practices.Composite.Modularity;
using Microsoft.Practices.Unity;
using Telerik.Windows.Controls;
using System.Windows;
namespace EliteExtender.Security.Domain
{
internal class ModuleController
{
private readonly IUnityContainer container;
private readonly IRegionManager regionManager;
private readonly IModuleCatalog moduleCatalog;
private readonly IModuleManager moduleManager;
#region PresentationModel
private LoginBoxViewModel presentationLoginModel;
private ManageUsersViewModel presentationManageUsersModel;
private ManagePermissionsViewModel presentationPermissionsModel;
private ManageRolesViewModel presentationManageRolesModel;
private RibbonTabViewModel presentationRibbonTabModel;
#endregion
public ModuleController(IUnityContainer container, IRegionManager regionManager, IModuleCatalog moduleCatalog, IModuleManager moduleManager)
{
if (Application.Current != null)
{
this.container = container;
this.regionManager = regionManager;
this.moduleCatalog = moduleCatalog;
this.moduleManager = moduleManager;
}
}
public void Initialize()
{
//Register the Login View so that we can get an IPrincipal
RegisterLoginView();
presentationLoginModel.Initialize();
presentationLoginModel.Open();
//Register and activate these after the login process has completed
LoadOnDemandModules();
RegisterViewsandServices();
RegisterViewModels();
}
/// <summary>
/// This method is responsible for loading all modules who are not loaded until a user has been authenticated
/// </summary>
private void LoadOnDemandModules()
{
foreach (ModuleInfo module in moduleCatalog.Modules)
{
if (module.InitializationMode == InitializationMode.OnDemand && module.State == ModuleState.NotStarted)
{
moduleManager.LoadModule(module.ModuleName);
}
}
}
private void RegisterLoginView()
{
container.RegisterType<ILoginBoxView, LoginBoxView>(new ContainerControlledLifetimeManager());
if (presentationLoginModel == null)
{
presentationLoginModel = container.Resolve<LoginBoxViewModel>();
}
}
private void RegisterViewsandServices()
{
container.RegisterType<IManagePermissionsView, ManagePermissionsView>(new ContainerControlledLifetimeManager());
container.RegisterType<ICreateModifyRoleView, CreateModifyRoleView>(new ContainerControlledLifetimeManager());
container.RegisterType<ICreateModifyUserView, CreateModifyUserView>(new ContainerControlledLifetimeManager());
container.RegisterType<IManageUsersView, ManageUsersView>(new ContainerControlledLifetimeManager());
container.RegisterType<IChangePermissionsView, ChangePermissionsView>(new ContainerControlledLifetimeManager());
container.RegisterType<IManageRolesView, ManageRolesView>(new ContainerControlledLifetimeManager());
container.RegisterType<IRibbonTabView, RibbonTabView>(new ContainerControlledLifetimeManager());
}
private void RegisterViewModels()
{
if (presentationManageUsersModel == null)
{
presentationManageUsersModel = container.Resolve<ManageUsersViewModel>();
// presentationManageUsersModel.Initialize();
}
if (presentationManageRolesModel == null)
{
presentationManageRolesModel = container.Resolve<ManageRolesViewModel>();
//presentationManageRolesModel.Initialize();
}
if (presentationPermissionsModel == null)
{
presentationPermissionsModel = container.Resolve<ManagePermissionsViewModel>();
}
if (presentationRibbonTabModel == null)
{
presentationRibbonTabModel = container.Resolve<RibbonTabViewModel>();
regionManager.Regions[RegionNames.RibbonBarRegion].Add(presentationRibbonTabModel.View);
}
regionManager.Regions[RegionNames.RibbonBarRegion].Activate(presentationRibbonTabModel.View);
}
}
}
Please let me know any comments you have on this soltuion. I really appreciate you sticking with this topic and working it through with us as I think it can benefit many Prism coders.
Thanks!