We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. (Last updated on: June 24, 2019).
Unfortunately, activation email could not send to your email. Please try again.
Syncfusion Feedback

IActiveAware when using the DockingManager in Prism 7

Thread ID:

Created:

Updated:

Platform:

Replies:

149522 Nov 28,2019 05:21 PM UTC Dec 2,2019 01:19 PM UTC WPF 3
loading
Tags: DockingManager
Jean-Marc
Asked On November 28, 2019 05:21 PM UTC

From your help page DockingManager/Patterns and Practices, in the Prism 6.1 section, you describe that a RegionAdapter must be implemented in order to adapt the DockingManager to an MVVM Prism application.

I followed your instruction and everything is running fine except for one detail.
When I was using the TabControl, ViewModel regions implementing the IActiveAware interface where effectively beeing called when the tab was changing.
However, when using the DockingManager, this functionnality fails.

From what I understand in Brian Lagunas (Prism implementer) article on the XamDockManager, I would need to implement a Region Behavior.
I did try to follow his advice but since the DockingManager has a different interface, I was not able to figure out the equivalent TabGroupPane and ContentPane classes and also the ActivePaneChanged event.

Can you provide me with an example of such a RegionBehavior.
See my example below taken from Brian's article.

////////////////////////////////////////////////////////////////////////////////////////////////////
using Prism.Regions;
using Prism.Regions.Behaviors;
using Syncfusion.Windows.Tools.Controls;
using System;
using System.Collections.Specialized;
using System.Windows;
using System.Windows.Controls;

namespace MacDap.App.Behaviors
{
    public class DocumentRegionActiveAwareBehavior : RegionBehavior, IHostAwareRegionBehavior
    {
        public const string BehaviorKey = "DocumentRegionActiveAwareBehavior";
        DockingManager _parentDockManager;

        TabGroupPane _hostControl;
        public DependencyObject HostControl
        {
            get { return _hostControl; }
            set { _hostControl = value as TabGroupPane; }
        }

        protected override void OnAttach()
        {
            _parentDockManager = DockingManager.GetDockingManager(_hostControl);
            if (_parentDockManager != null)
                _parentDockManager.ActivePaneChanged += DockManager_ActivePaneChanged;

            Region.ActiveViews.CollectionChanged += ActiveViews_CollectionChanged; ;
        }

        void DockManager_ActivePaneChanged(object sender, RoutedPropertyChangedEventArgs<ContentPane> e)
        {
            if (e.OldValue != null)
            {
                var item = e.OldValue;

                //are we dealing with a ContentPane directly
                if (Region.Views.Contains(item) && Region.ActiveViews.Contains(item))
                {
                    Region.Deactivate(item);
                }
                else
                {
                    //now check to see if we have any views that were injected
                    var contentControl = item as ContentControl;
                    if (contentControl != null)
                    {
                        var injectedView = contentControl.Content;
                        if (Region.Views.Contains(injectedView) && Region.ActiveViews.Contains(injectedView))
                            Region.Deactivate(injectedView);
                    }
                }
            }

            if (e.NewValue != null)
            {
                var item = e.NewValue;

                //are we dealing with a ContentPane directly
                if (Region.Views.Contains(item) && !this.Region.ActiveViews.Contains(item))
                {
                    Region.Activate(item);
                }
                else
                {
                    //now check to see if we have any views that were injected
                    var contentControl = item as ContentControl;
                    if (contentControl != null)
                    {
                        var injectedView = contentControl.Content;
                        if (Region.Views.Contains(injectedView) && !this.Region.ActiveViews.Contains(injectedView))
                            Region.Activate(injectedView);
                    }
                }
            }
        }

        void ActiveViews_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                FrameworkElement frameworkElement = e.NewItems[0] as FrameworkElement;
                if (frameworkElement != null)
                {
                    ContentPane contentPane = frameworkElement as ContentPane;
                    if (contentPane == null)
                        contentPane = frameworkElement.Parent as ContentPane;

                    if (contentPane != null && !contentPane.IsActivePane)
                        contentPane.Activate();
                }
            }
        }
    }


}


Kanniyappan Panneer Selvam [Syncfusion]
Replied On November 29, 2019 10:50 AM UTC

Hi Jean, 
 
Thanks for contacting Syncfusion support. 
 
We have checked your query “ IActiveAware when using the DockingManager in Prism 7” and tries to prepared the sample to meet your requirement. In this sample we have implemented RegionBehavior using prism 7 as you have mentioned in the “Brian Lagunas” article. Please find the sample from below location. 
 
Note: Launch the ‘PrismTutorial’ solution file to run this sample. 
 
 
Please let us know if you have any further assistance. 
 
Regards, 
Kanniyappan P 


Jean-Marc
Replied On November 29, 2019 03:15 PM UTC

Hi Kanniyappan P,

Your sample works great!
May I suggest that you update your help page and provide this example.
Also, from what I saw in Brian's examples, the RegionAdapter Adapt override can be written without requiering using System.Linq and System.Windows.Controls. As such it is no big deal but eventually binding to System.Windows.Controls could make the code difficult to port.
See the Adapt override suggestion below.

Thanks again for your quick and precise response on this!
Jean-Marc Da Pozzo


        protected override void Adapt(IRegion region, DockingManager regionTarget)
        {
            region.Views.CollectionChanged += (s, e) =>
            {
                if (e.Action == NotifyCollectionChangedAction.Add)
                {
                    foreach (FrameworkElement element in e.NewItems)
                    {
                        regionTarget.Children.Add(element);
                    }
                }
            };
        }


Niranjan Kumar Gopalan [Syncfusion]
Replied On December 2, 2019 01:19 PM UTC

Hi Jean-Marc Da Pozzo, 
  
Thanks for your update. 
  
We are glad that the provided sample has met your requirement. 
  
Query  1:  “May I suggest that you update your help page and provide this example.” 
Currently we are working to update the help documentation about how to configure the views in DockingManager using Prism 7.1. We will include this changes in our upcoming volume release.  
  
Query 2 “Also, from what I saw in Brian's examples, the RegionAdapter Adapt override can be written without requiering using System.Linq and System.Windows.Controls”. 
Thanks for your valuable feedback. We will check with your code snippets, if all the possible cases woks fine then we will configure the same as you provided. 
  
Regards, 
Niranjan Kumar 
 
 


CONFIRMATION

This post will be permanently deleted. Are you sure you want to continue?

Sorry, An error occured while processing your request. Please try again later.

Please sign in to access our forum

This page will automatically be redirected to the sign-in page in 10 seconds.

Warning Icon You are using an outdated version of Internet Explorer that may not display all features of this and other websites. Upgrade to Internet Explorer 8 or newer for a better experience.Close Icon

Live Chat Icon For mobile
Live Chat Icon