public DGMLGraph ToDGMLGraph()
        {
            DGMLGraph dgmlGraph = new DGMLGraph();

            foreach (GraphItem node in GraphItems)
            {
                dgmlGraph.Nodes.Add(new DGMLGraph.Node {
                    Id = node.AbsoluteFilename, Label = node.FormattedName
                });
                foreach (Include include in node.Includes)
                {
                    dgmlGraph.Links.Add(new DGMLGraph.Link {
                        Source = node.AbsoluteFilename, Target = include.IncludedFile?.AbsoluteFilename ?? null
                    });
                }
            }

            return(dgmlGraph);
        }
        static public DGMLGraph ToDGMLGraph(this IncludeGraph graph, bool folderGrouping, bool expandGroups)
        {
            var uniqueTransitiveChildrenMap = FindUniqueChildren(graph.GraphItems);

            DGMLGraph dgmlGraph = new DGMLGraph();

            foreach (GraphItem node in graph.GraphItems)
            {
                dgmlGraph.Nodes.Add(new DGMLGraph.Node
                {
                    Id          = node.AbsoluteFilename,
                    Label       = node.FormattedName,
                    Background  = null,
                    NumIncludes = node.Includes.Count,
                    NumUniqueTransitiveChildren = uniqueTransitiveChildrenMap[node].Count,
                });
                foreach (Include include in node.Includes)
                {
                    dgmlGraph.Links.Add(new DGMLGraph.Link {
                        Source = node.AbsoluteFilename, Target = include.IncludedFile?.AbsoluteFilename ?? null
                    });
                }
            }

            if (folderGrouping)
            {
                // Reusing a ViewModel datastructure is arguably a bit ugly, but it matches exactly what we want.
                // TODO: Consider splitting functionallity out.
                var folderGroupingRoot = new FolderIncludeTreeViewItem_Root(graph.GraphItems, null);
                foreach (var child in folderGroupingRoot.Children)
                {
                    AddFolderGroupingRecursive(dgmlGraph, child, null, expandGroups);
                }
            }


            return(dgmlGraph);
        }
        private static void AddFolderGroupingRecursive(DGMLGraph dgml, IncludeTreeViewItem child, FolderIncludeTreeViewItem_Folder parent, bool expandGroups)
        {
            if (parent != null)
            {
                dgml.Links.Add(new DGMLGraph.Link {
                    Type = DGMLGraph.Link.LinkType.GroupContains, Source = parent.AbsoluteFilename, Target = child.AbsoluteFilename
                });
            }

            if (child is FolderIncludeTreeViewItem_Folder folder)
            {
                dgml.Nodes.Add(new DGMLGraph.Node
                {
                    Id            = folder.AbsoluteFilename,
                    Label         = folder.Name,
                    GroupCollapse = expandGroups ? DGMLGraph.Node.GroupCollapseState.Expanded : DGMLGraph.Node.GroupCollapseState.Collapsed
                });
                foreach (var subChild in folder.Children)
                {
                    AddFolderGroupingRecursive(dgml, subChild, folder, expandGroups);
                }
            }
        }