public static Func <PrintElementNode, bool> InsertChildToCollection(PrintElementNodeBuilder builder,
                                                                            ICollection <PrintElementNode> elements, PrintElementNode parentElementNode, string childElementCollection,
                                                                            bool wrapElementMetadata = true)
        {
            return(childElementNode =>
            {
                if (parentElementNode.CanInsertChild.TryInvoke(childElementNode))
                {
                    // Создание метаданных нового дочернего элемента
                    object newChildElementMetadata = childElementNode.ElementMetadata ?? new DynamicWrapper();

                    // Добавление дочернего элемента в коллекцию метаданных родительского элемента
                    var childElements = GetChildElementCollection(parentElementNode, childElementCollection, true);
                    childElements.AddItem(wrapElementMetadata
                        ? WrapElementMetadata(childElementNode.ElementType, newChildElementMetadata)
                        : newChildElementMetadata);

                    // Добавление дочернего элемента в визуальное дерево элементов
                    builder.BuildElement(elements, parentElementNode, newChildElementMetadata,
                                         childElementNode.ElementType);

                    return true;
                }

                return false;
            });
        }
        public static Func <PrintElementNode, bool> InsertChildToContainer(PrintElementNodeBuilder builder,
                                                                           ICollection <PrintElementNode> elements, PrintElementNode parentElementNode, string childElementContainer,
                                                                           bool wrapElementMetadata = true)
        {
            return(childElementNode =>
            {
                if (parentElementNode.CanInsertChild.TryInvoke(childElementNode))
                {
                    var oldChildElement = parentElementNode.Nodes.FirstOrDefault();

                    if (oldChildElement == null ||
                        Helpers.AcceptQuestionMessage(Resources.ReplaceElementQuestion, parentElementNode,
                                                      childElementNode))
                    {
                        // Создание метаданных нового дочернего элемента
                        object newChildElementMetadata = childElementNode.ElementMetadata ?? new DynamicWrapper();

                        // Добавление дочернего элемента в контейнер метаданных родительского элемента
                        parentElementNode.ElementMetadata[childElementContainer] = wrapElementMetadata
                            ? WrapElementMetadata(childElementNode.ElementType, newChildElementMetadata)
                            : newChildElementMetadata;

                        if (oldChildElement != null)
                        {
                            // Удаление старого дочернего элемента из визуального дерева элементов
                            parentElementNode.Nodes.RemoveItem(oldChildElement);
                            DeleteChildNodes(elements, oldChildElement);
                        }

                        // Добавление дочернего элемента в визуальное дерево элементов
                        builder.BuildElement(elements, parentElementNode, newChildElementMetadata,
                                             childElementNode.ElementType);

                        return true;
                    }
                }

                return false;
            });
        }