private void UpdateNodesInternal(TreeNodeCollection nodes)
        {
            List<TreeItem> children = GetChildren().ToList();
            Dictionary<TreeItem, bool> shouldShow = children.ToDictionary(x => x, x => true);
            int i, j;
            for (i = 0, j = 0; j < children.Count; )
            {
                TreeNode node = i < nodes.Count ? nodes[i] : null;
                TreeItem item = node != null ? node.Tag as TreeItem : null;

                if (children[j].Equals(item))
                {
                    children[j].UpdateInternal(node);
                    i++; j++;
                }
                else if (node == null || (item != null && shouldShow.ContainsKey(item)))
                {
                    nodes.Insert(i, children[j].CreateNode());
                    i++; j++;
                }
                else
                {
                    nodes.RemoveAtWithSelectionBackup(i, nodes[i].TreeView, nodes[i].Parent);
                }
            }
            for (int k = nodes.Count - 1; k >= i; k--)
                nodes.RemoveAtWithSelectionBackup(k, nodes[k].TreeView, nodes[k].Parent);
        }