private void CollapseExpandButton_Click(object sender, RoutedEventArgs e)
        {
            // the Button is in the visual tree of a Node
            Button button = (Button)sender;
            Group  sg     = Part.FindAncestor <Group>(button);

            if (sg != null)
            {
                SimpleData subgraphdata = (SimpleData)sg.Data;
                if (!subgraphdata.IsSubGraph)
                {
                    return;
                }
                // always make changes within a transaction
                myDiagram.StartTransaction("CollapseExpand");
                // if needed, create the child data for this node
                if (!subgraphdata.EverExpanded && !sg.IsExpandedSubGraph)
                {
                    subgraphdata.EverExpanded = true;  // only create children once per node
                    int nummembers = CreateSubGraph(subgraphdata);
                    if (nummembers == 0)
                    {  // now known no children: don't need Button
                        button.Visibility = Visibility.Collapsed;
                    }
                }
                // toggle whether this node is expanded or collapsed
                sg.IsExpandedSubGraph = !sg.IsExpandedSubGraph;
                myDiagram.Panel.CenterPart(sg);
                myDiagram.CommitTransaction("CollapseExpand");
            }
        }
        // Create some member nodes, including nested subgraphs, for PARENTDATA.
        // PARENTDATA may be null when creating the initial, top-level nodes
        private int CreateSubGraph(SimpleData group)
        {
            ISubGraphModel sgmodel = myDiagram.Model as ISubGraphModel;

            if (sgmodel == null)
            {
                return(0);
            }
            myDiagram.StartTransaction("Add Group contents");

            var nodes      = new List <SimpleData>(); // this will contain all of the member nodes created
            int groupCount = myDiagram.Nodes.OfType <Group>().Count();

            // create a random number of subgraphs
            // ensure there are at least 10 groups in the diagram
            var numgroups = rand.Next(2);

            if (groupCount < 10)
            {
                numgroups += 1;
            }
            for (int i = 0; i < numgroups; i++)
            {
                var g = new SimpleData();
                g.Color      = String.Format("#{0:X}{1:X}{2:X}", 80 + rand.Next(100), 80 + rand.Next(100), 80 + rand.Next(100));
                g.Key        = "group" + (i + groupCount).ToString();
                g.IsSubGraph = true;
                if (group != null)
                {
                    g.SubGraphKey = group.Key;                // declare that it's a member of nodedata
                }
                sgmodel.AddNode(g);
                nodes.Add(g);
            }
            var numnodes = rand.Next(4) + 2;

            // create a random number of non-group nodes
            for (int i = 0; i < numnodes; i++)
            {
                var n = new SimpleData();
                n.Color = String.Format("#{0:X}{1:X}{2:X}", 80 + rand.Next(100), 80 + rand.Next(100), 80 + rand.Next(100));
                n.Key   = n.Color;
                if (group != null)
                {
                    n.SubGraphKey = group.Key;                // declare that it's a member of nodedata
                }
                sgmodel.AddNode(n);
                nodes.Add(n);
            }

            // add at least one link from each node to another
            // this could result in clusters of nodes unreachable from each other, but no lone nodes
            nodes.Sort((x, y) => x.Color.CompareTo(y.Color));
            for (int i = 0; i < nodes.Count; i++)
            {
                var d    = nodes[i];
                int from = rand.Next(nodes.Count - i) + i;
                if (from != i)
                {
                    d.FromKeys.Add(nodes[from].Key);
                }
            }

            myDiagram.CommitTransaction("Add Group contents");
            return(nodes.Count);
        }