/// <summary>
        /// Handles a change to the Navigation change property.
        /// </summary>
        /// <param name="dependencyObject">The object that owns the property.</param>
        /// <param name="dependencyPropertyChangedEventArgs">A description of the changed property.</param>
        private static void OnSelectedValueChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            // Extract the variables from the generic arguments.
            FolderNavBar  folderNavBar = dependencyObject as FolderNavBar;
            FolderNavNode newValue     = dependencyPropertyChangedEventArgs.NewValue as FolderNavNode;

            folderNavBar.breadcrumb.SelectedItem = newValue;
            folderNavBar.history.Remove(newValue);
            folderNavBar.history.Insert(0, newValue);
            if (folderNavBar.MaxHistoryCount != 0 && folderNavBar.history.Count > folderNavBar.MaxHistoryCount)
            {
                folderNavBar.history.RemoveAt(folderNavBar.history.Count - 1);
            }
        }
        /// <summary>
        ///  GetPath of the item
        /// </summary>
        /// <param name="rootItem"></param>
        /// <param name="item"></param>
        /// <returns></returns>
        public static string GetPath(object rootItem, object item)
        {
            FolderNavNode rootNode   = rootItem as FolderNavNode;
            FolderNavNode targetNode = item as FolderNavNode;

            if (null == rootNode || null == targetNode)
            {
                return(string.Empty);
            }

            if (rootNode.Entity.EntityId == targetNode.Entity.EntityId)
            {
                return(rootNode.Entity.Name);
            }

            TreeTraverseHelper.Node <FolderNavNode> leafNode = rootNode.FindLeafNode(
                t => t.Entity.EntityId == targetNode.Entity.EntityId,
                (parent) => parent.Children
                );


            //Unwind the leaf node.
            if (leafNode != null)
            {
                List <FolderNavNode> listPath = new List <FolderNavNode>();
                TreeTraverseHelper.Node <FolderNavNode> currentNode = leafNode;
                do
                {
                    listPath.Add(currentNode.Item);
                    currentNode = currentNode.Parent;
                }while (currentNode != null);

                listPath.Reverse();

                StringBuilder path = new StringBuilder(rootNode.Entity.Name);
                foreach (var node in listPath)
                {
                    path.Append(Path.DirectorySeparatorChar + node.Entity.Name);
                }

                return(path.ToString());
            }

            return(String.Empty);
        }
        /// <summary>
        /// Gets the id for the specified item.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <returns></returns>
        public static string GetObjectName(object item)
        {
            if (item is FolderNavNode)
            {
                FolderNavNode FolderNavNode = item as FolderNavNode;
                return(FolderNavNode.Entity.Name);
            }
            else
            {
                EntityNode entity = item as EntityNode;
                if (null != entity)
                {
                    return(entity.Name);
                }
            }

            return(String.Empty);
        }
        /// <summary>
        /// Gets the trail for the specified item.
        /// </summary>
        /// <param name="rootItem">The root item.</param>
        /// <param name="path">The item.</param>
        /// <returns></returns>
        public static IList GetTrail(object rootItem, string path)
        {
            // Make sure the specified path is valid
            if (string.IsNullOrEmpty(path))
            {
                return(null);
            }

            // If the root item was not passed, then we cannot build a trail
            FolderNavNode rootNode = rootItem as FolderNavNode;

            if (null == rootNode)
            {
                return(null);
            }

            return(GetPathList(path, rootNode));
        }
        private static IList GetPathList(string path, FolderNavNode rootNode)
        {
            // Break the path up based on the available path separators
            string[] pathEntries = path.Split(new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar },
                                              StringSplitOptions.RemoveEmptyEntries);
            if (null == pathEntries || 0 == pathEntries.Length)
            {
                return(null);
            }

            List <object> trail = new List <object>();

            trail.Add(rootNode);

            IEnumerable <FolderNavNode> currentDepthCollection = rootNode;

            //Start from 1 since the rootnode is already added.
            for (int index = 1; index < pathEntries.Length; index++)
            {
                bool bEntryFound = false;
                foreach (var treeNode in currentDepthCollection)
                {
                    if (string.CompareOrdinal(treeNode.Entity.Name, pathEntries[index]) == 0)
                    {
                        trail.Add(treeNode);
                        bEntryFound            = true;
                        currentDepthCollection = treeNode.Children;
                        break;
                    }
                }

                if (false == bEntryFound)
                {
                    ReportPathError(path);
                    return(null);
                }
            }
            return(trail);
        }
 private void OnSelectedItemChanged(object sender, ActiproSoftware.Windows.ObjectPropertyChangedRoutedEventArgs routedPropertyChangedEventArgs)
 {
     try
     {
         if (this.RootNode != null)
         {
             // Extract the selected node from the event arguments.
             FolderNavNode selectedNode = routedPropertyChangedEventArgs.NewValue as FolderNavNode;
             if (selectedNode != null)
             {
                 RoutedEventArgs newEventArgs = new RoutedEventArgs(FolderNavBar.NodeSelectionChangedEvent);
                 newEventArgs.Source = selectedNode;
                 RaiseEvent(newEventArgs);
             }
         }
     }
     catch (Exception ex)
     {
         System.Console.Error.WriteLine(ex.Message);
         throw;
     }
 }