protected override UIWidget BuildTree(Element childView, UIWidget parentWidget)
        {
            /*
             *  1. Return parent widget if child view is null.
             *  Since, We won't be able to create a UIWidget out of the view.
             */

            if (childView == null)
            {
                return(parentWidget);
            }

            /*
             *  2. Create a UIWidget for the child view.
             */

            var childWidget = CreateUIWidget(childView, parentWidget);

            parentWidget.Children.Add(childWidget);

            if (ElementHelper.HasContentProperty(childView))
            {
                childWidget.AllowsManyChildren        = ElementHelper.ContentPropertyAllowsManyChildren(childView);
                childWidget.IsContentPropertyViewType = ElementHelper.IsContentPropertyView(childView);
                childWidget.ContentPropertyTypeName   = ElementHelper.GetContentPropertyTypeName(childView);
                childWidget.HasContentProperty        = true;
                childWidget.IsLayout = false;
            }
            else
            {
                childWidget.HasContentProperty = false;
            }

            /*
             *  3. Determine if the child view has children of it's own.
             */

            var isParentView = childView as ILayoutController;

            if (isParentView != null)
            {
                childWidget.IsLayout = true;
            }

            // ListView check
            IReadOnlyList <Element> grandChildren;
            var isListView = childView as ITemplatedItemsView <Cell>;

            if (isListView == null)
            {
                grandChildren = isParentView?.Children;
            }
            else
            {
                grandChildren = isListView.TemplatedItems;
            }

            // TableView check
            if (grandChildren == null && childView is TableView)
            {
                var tableView = childView as TableView;
                var cells     = new List <Element>();

                foreach (var section in tableView.Root)
                {
                    foreach (var cell in section)
                    {
                        cells.Add(cell);
                    }
                }

                grandChildren = cells.ToArray();
            }

            // no children
            if (grandChildren == null || grandChildren.Count == 0)
            {
                return(parentWidget);
            }

            /*
             *  4. The child does have it's own children.
             */

            foreach (var grandChild in grandChildren)
            {
                if (grandChild != null)
                {
                    if (grandChild is ILayoutController)
                    {
                        BuildTree(grandChild, childWidget);
                    }
                    else if (grandChild is ListView)
                    {
                        BuildTree(grandChild, childWidget);
                    }
                    else if (grandChild is TableView)
                    {
                        var grandTable  = grandChild as TableView;
                        var tableWidget = CreateUIWidget(grandChild, childWidget);

                        childWidget.Children.Add(tableWidget);

                        foreach (var section in grandTable.Root)
                        {
                            foreach (var cell in section)
                            {
                                BuildTree(cell, tableWidget);
                            }
                        }
                    }
                    else if (grandChild is ViewCell)
                    {
                        var grandViewCell       = grandChild as ViewCell;
                        var grandViewCellWidget = CreateUIWidget(grandChild, childWidget);

                        childWidget.Children.Add(grandViewCellWidget);

                        if (grandViewCell.View != null)
                        {
                            BuildTree(grandViewCell.View, grandViewCellWidget);
                        }
                    }
                    else
                    {
                        var grandChildWidget = CreateUIWidget(grandChild, childWidget);

                        if (ElementHelper.HasContentProperty(grandChild))
                        {
                            grandChildWidget.IsLayout = true;
                        }

                        childWidget.Children.Add(grandChildWidget);
                    }
                }
            }

            return(parentWidget);
        }