public FormTemplateModel(GenerateFormModel generateFormModel)
        {
            if (generateFormModel == null)
            {
                throw new ArgumentNullException(nameof(generateFormModel));
            }
            _generateFormModel = generateFormModel;
            this.RootObject    = generateFormModel.RootObject;
            this.FormComponentModelCollection = GetFormComponentModelCollection();
            this.BorderHelper       = new BorderHelper(generateFormModel.ProjectType);
            this.GridHelper         = new GridHelper();
            this.LabelHelper        = new LabelHelper(generateFormModel.ProjectType);
            this.ScrollViewerHelper = new ScrollViewerHelper(generateFormModel.ProjectType);
            this.StackPanelHelper   = new StackPanelHelper(generateFormModel.ProjectType);
            this.TextBlockHelper    = new TextBlockHelper(generateFormModel.ProjectType);
            this.TableViewHelper    = new TableViewHelper();
            this.TableRootHelper    = new TableRootHelper();
            this.TableSectionHelper = new TableSectionHelper();
            this.ViewCellHelper     = new ViewCellHelper();

            SetRootGridRows();
            SetRootGridColumns();
            MakeRootControl();
            InitializeParentControlWithControlsIncludedOnSameRow();
        }
        protected FormComponentModelBase(GenerateFormModel generateFormModel, PropertyInformationViewModel viewModel)
        {
            if (generateFormModel == null)
            {
                throw new ArgumentNullException(nameof(generateFormModel));
            }
            if (viewModel == null)
            {
                throw new ArgumentNullException(nameof(viewModel));
            }

            this.ViewModel = viewModel;

            this.ColumnRootObject = generateFormModel.ColumnRootObject;

            this.ControlLayoutRoot = RootObject.None;

            if (generateFormModel.LabelPosition == LabelPosition.Left)
            {
                this.ControlLayoutRoot = RootObject.Grid;
            }

            if (generateFormModel.ColumnRootObject == RootObject.Grid)
            {
                this.ControlLayoutRoot = RootObject.None;
            }

            if (this.ViewModel.IncludeNextControlInRow)
            {
                this.ControlLayoutRoot = RootObject.Grid;
            }

            if (generateFormModel.ColumnRootObject == RootObject.TableView)
            {
                this.ControlLayoutRoot = RootObject.Grid;
            }

            // default these values to WPF & UWP & Silverlight
            var widthName  = "Width";
            var heightName = "Height";
            var horizontalAlignmentName = "HorizontalAlignment";
            var verticalAlignmentName   = "VerticalAlignment";

            if (generateFormModel.ProjectType == ProjectType.Xamarin)
            {
                widthName  = "WidthRequest";
                heightName = "HeightRequest";
                horizontalAlignmentName = "HorizontalOptions";
                verticalAlignmentName   = "VerticalOptions";

                if (!viewModel.Width.HasValue)
                {
                    switch (viewModel.ControlDefinition.ControlType)
                    {
                    case ControlType.XamarinButton:
                        this.HorizontalAlignmentText = $"{horizontalAlignmentName}=\"Start\" ";
                        break;

                    case ControlType.XamarinImage:
                        this.HorizontalAlignmentText = $"{horizontalAlignmentName}=\"Center\" ";
                        this.VerticalAlignmentText   = $"{verticalAlignmentName}=\"Center\" ";
                        break;

                    case ControlType.WpfButton:
                        this.HorizontalAlignmentText = $"{horizontalAlignmentName}=\"Left\" ";
                        this.VerticalAlignmentText   = $"{verticalAlignmentName}=\"Center\" ";
                        break;
                    }
                }
            }
            else if (generateFormModel.ProjectType == ProjectType.Wpf || generateFormModel.ProjectType == ProjectType.Silverlight)
            {
                if (!viewModel.Width.HasValue)
                {
                    switch (viewModel.ControlDefinition.ControlType)
                    {
                    case ControlType.WpfButton:
                    case ControlType.SilverlightButton:
                        this.HorizontalAlignmentText = $"{horizontalAlignmentName}=\"Left\" ";
                        this.VerticalAlignmentText   = $"{verticalAlignmentName}=\"Center\" ";
                        break;

                    case ControlType.WpfImage:
                    case ControlType.SilverlightImage:
                        this.HorizontalAlignmentText = $"{horizontalAlignmentName}=\"Center\" ";
                        this.VerticalAlignmentText   = $"{verticalAlignmentName}=\"Center\" ";
                        break;
                    }
                }
            }

            if (viewModel.Height.HasValue)
            {
                this.HeightText = $"{heightName}=\"{viewModel.Height.Value}\" ";
            }

            if (viewModel.Width.HasValue)
            {
                this.WidthText = $"{widthName}=\"{viewModel.Width.Value}\" ";
            }

            if (generateFormModel.AddNameToUIControls)
            {
                this.ControlNameText = $"x:Name=\"{viewModel.Name.Substring(0, 1).ToLower()}{viewModel.Name.Substring(1)}\" ";
            }

            if (viewModel.LabelWidth.HasValue)
            {
                this.LabelWidthText = $"{widthName}=\"{viewModel.LabelWidth.Value}\" ";
            }

            if (!String.IsNullOrWhiteSpace(viewModel.StringFormat))
            {
                this.StringFormatText = $", StringFormat='{viewModel.StringFormat}'";
            }

            this.TableSectionTitle = viewModel.TableSectionTitle;
        }