'RadioGroup SelectValue Binding

Good morning

I have a problem with binding initial state for each radio button.

<StackLayout Orientation="Horizontal"
             RadioButtonGroup.GroupName="{Binding Source}"
             RadioButtonGroup.SelectedValue="{Binding Frequency}">

                 <RadioButton FontSize="10" Content="Never" Value="0"/>
                 <RadioButton FontSize="10" Content="Rare" Value="25"/>
                 <RadioButton FontSize="10" Content="Often" Value="75"/>
                 <RadioButton FontSize="10" Content="Always" Value="100"/>
</StackLayout>

When the view is loaded there is no any RadioButton selected. The source binding Frequency is of type double.

public double Frequency
{
        get => GetPropertyValue<double>();
        set => SetPropertyValue(value);
}

I was thinking it is related with comparassion of types object and double. I have created converter as below:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!int.TryParse(value.ToString(), out var intValue))
            return value;

        var result =  FrequencyValues.GetValue(intValue).ToString();

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!int.TryParse(value.ToString(), out var intValue))
            return value;

        var result =  FrequencyValues.GetValue(intValue);

        return result;
    }

The solution with converter is also not working. Is that related with comprassion of types or I am missing some knowledge?

Thanks!



Solution 1:[1]

try

  <StackLayout  
       RadioButtonGroup.GroupName="Source" 
       RadioButtonGroup.SelectedValue="{Binding Frequency}"
       >
           <RadioButton  Content="a" Value="1"
               IsChecked="{Binding Frequency, Converter={StaticResource RadioIsCheckedConverter}, ConverterParameter={x:Reference page}}" />
           <RadioButton  Content="b" Value="2"
               IsChecked="{Binding Frequency, Converter={StaticResource RadioIsCheckedConverter}, ConverterParameter={x:Reference page}}" />
            
   </StackLayout>

converter


 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                var radioButton = parameter as RadioButton;

                if (radioButton != null && radioButton.Value.Equals(value))
                {
                    return true;
                }
            }
            return false;
        }

Solution 2:[2]

Change the type of Frequency from Double to Object;

The same Xaml as yours.

Code behind:

    public partial class Page1 : ContentPage
{
    RadioButtonModel _viewModel;
    public Page1()
    {
        InitializeComponent();
        _viewModel = new RadioButtonModel() { Source = "Group1", Frequency="100" };
        this.BindingContext = _viewModel;
    }

}


public class RadioButtonModel : INotifyPropertyChanged
{
    private object _frequency;
    public object Frequency
    {
        get => _frequency;
        set
        {
            _frequency = value;
            GetPropertyValue(nameof(Frequency));
        }
    }

    private string _source;
    public string Source
    {
        get => _source;
        set
        {
            _source = value;
            GetPropertyValue(nameof(Source));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    void GetPropertyValue(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Amjad S.
Solution 2 Wendy Zang - MSFT