I am working with PRISM and trying to learn how to use it properly. So far I created 3 views:
- MainWindow: This is my Shell Containing 2 Buttons for Navigation: ViewA,ViewB
- ViewA
- ViewB
The Shell hosts a Region (DockManager from SyncFusion) to inject views into. Inside the ViewModel of the Shell I use a DelegateCommand to Navigate:
_regionManager.RequestNavigate("ContentRegion", uri);
The views are registered inside the Bootstrapper
Container.RegisterTypeForNavigation<ViewA>("ViewA");
Container.RegisterTypeForNavigation<ViewB>("ViewB");
This works fine when I use a simple TabControl to host my region. To use the DockManager from the SyncFusion Toolkit I created an adapter and have overridden the function:
protected override void Adapt(IRegion region, DockingManager regionTarget)
{
region.Views.CollectionChanged += delegate
{
foreach (var child in region.Views.Cast<UserControl>())
{
if (!regionTarget.Children.Contains(child))
{
regionTarget.BeginInit();
regionTarget.Children.Add(child);
regionTarget.EndInit();
}
}
};
regionTarget.WindowClosing += delegate (object sender, WindowClosingEventArgs args)
{
var child = args.TargetItem as UserControl;
region.Remove(child);
};
regionTarget.CloseButtonClick += delegate (object sender, CloseButtonEventArgs args)
{
var child = args.TargetItem as UserControl;
region.Remove(child);
};
region.NavigationService.Navigated += RegionTarget_Navigated;
}
private void RegionTarget_Navigated(object sender, RegionNavigationEventArgs e)
{
}
What I am now trying to handle is the case that a view is navigated to, which is already contained in my DockingManager. In this case the view should be set as active. To achieve that I tried to subscribe to the 'Navigated'-Event of the Region. Would this be the right way? How can I get the correct View from the Navigation-URI? Or should I try on handle that scenario inside my viewmodels (with OnNavigatedTo from INavigationAware).
Activation can be handled by listening to the ActiveViews.CollectionChanged event and then activate the correct tab in your docking control. It would be better to have a custom RegionBehavior handle this for you instead of putting it in the RegionAdapter.
You can use this blog post about writing an adapter for the Infragistics xamDockManager as a guide: http://brianlagunas.com/xamdockmanager-prism-region-adapter-update-3/