private void AddControlContainers(string bindingName, Type propertyType, AutoFormsOrientation orientation) { var dict = EnumHelper.ToDictionary(propertyType); var inline = false; if (_attribute is AutoFormsRadioButtonAttribute rba) { inline = rba.Inline; } var g = new RadioGroup { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.StartAndExpand, }; g.SetBinding( RadioGroup.SelectedIndexProperty, new Binding(bindingName, BindingMode.TwoWay, new EnumConverter(), propertyType)); var h = new Grid { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.StartAndExpand, }; if (orientation == AutoFormsOrientation.Horizontal) { Grid.SetRow(g, 1); Grid.SetColumn(g, 1); Grid.SetRow(h, 0); Grid.SetColumn(h, 1); } else { Grid.SetRow(g, 1); Grid.SetColumn(g, 1); Grid.SetRow(h, 1); Grid.SetColumn(h, 0); } foreach (var kvp in dict) { var radio = new RadioButton { HorizontalOptions = inline ? LayoutOptions.End : LayoutOptions.CenterAndExpand, VerticalOptions = LayoutOptions.CenterAndExpand, }; var lbl = new Label { Style = LabelStyle, Text = kvp.Value, VerticalOptions = LayoutOptions.CenterAndExpand, VerticalTextAlignment = TextAlignment.Center, HorizontalOptions = LayoutOptions.Fill, HorizontalTextAlignment = inline ? TextAlignment.Start : TextAlignment.Center, LineBreakMode = LineBreakMode.WordWrap, GestureRecognizers = { new TapGestureRecognizer { Command = new Command(() => radio.SelectItem()) } } }; if (_attribute.Orientation == AutoFormsOrientation.Horizontal) { if (!inline) { g.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Star }); h.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Star }); Grid.SetColumn(radio, g.ColumnDefinitions.Count - 1); Grid.SetColumn(lbl, g.ColumnDefinitions.Count - 1); } else { g.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Star }); Grid.SetColumn(radio, g.ColumnDefinitions.Count - 1); g.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Star }); Grid.SetColumn(lbl, g.ColumnDefinitions.Count - 1); } } else { // have to force them the same height h.RowDefinitions.Add(new RowDefinition { Height = 40 }); g.RowDefinitions.Add(new RowDefinition { Height = 40 }); Grid.SetRow(radio, g.RowDefinitions.Count - 1); Grid.SetRow(lbl, g.RowDefinitions.Count - 1); if (!inline) { lbl.HorizontalTextAlignment = TextAlignment.End; radio.HorizontalOptions = LayoutOptions.StartAndExpand; } else { if (g.ColumnDefinitions.Count < 2) { g.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); } if (g.ColumnDefinitions.Count < 2) { g.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Star }); } Grid.SetColumn(radio, 0); Grid.SetColumn(lbl, 1); } } if (!inline) { h.Children.Add(lbl); } else { g.Children.Add(lbl); } g.Children.Add(radio); } if (_attribute.Orientation == AutoFormsOrientation.Horizontal) { SetHorizontalLayoutOptions(g, _attribute.HorizontalControlOptions); SetHorizontalLayoutOptions(h, _attribute.HorizontalControlOptions); } if (_attribute.ControlWidthRequest > 0) { g.WidthRequest = _attribute.ControlWidthRequest; h.WidthRequest = _attribute.ControlWidthRequest; } var c = Content as Grid; c.Children.Add(g); if (!_hideHeader && !inline) { c.Children.Add(h); } }