Search code examples
wpfbindingradio-buttonradio-group

binding radiobuttons group to a property in WPF


Let's imagine that I have:

<RadioButton GroupName="Group1" IsChecked="{Binding Path=RadioButton1IsChecked}" />
<RadioButton GroupName="Group1" IsChecked="{Binding Path=RadioButton2IsChecked}" />

And then in my data source class I have:

public bool RadioButton1IsChecked { get; set; }
public bool RadioButton2IsChecked { get; set; }
public enum RadioButtons { RadioButton1, RadioButton2, None }
public RadioButtons SelectedRadioButton
{
    get
    {
        if (this.RadioButtonIsChecked) 
            return RadioButtons.RadioButton1;
        else if (this.RadioButtonIsChecked) 
            return RadioButtons.RadioButton2;
        else 
            return RadioButtons.None;
     }
}

Can I somehow bind my radio buttons directly to SelectedRadioButton property? I really need RadioButton1IsChecked and RadioButton2IsChecked properties only to calculate the selected radiobutton.


Solution

  • <RadioButton GroupName="Group1" IsChecked="{Binding Path=SelectedRadioButton, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=RadioButton1}" />
    <RadioButton GroupName="Group1" IsChecked="{Binding Path=SelectedRadioButton, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=RadioButton2}" />
    
    public enum RadioButtons { RadioButton1, RadioButton2, None }
    public RadioButtons SelectedRadioButton {get;set;}
    
     public class EnumBooleanConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                var ParameterString = parameter as string;
                if (ParameterString == null)
                    return DependencyProperty.UnsetValue;
    
                if (Enum.IsDefined(value.GetType(), value) == false)
                    return DependencyProperty.UnsetValue;
    
                object paramvalue = Enum.Parse(value.GetType(), ParameterString);
                return paramvalue.Equals(value);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                var ParameterString = parameter as string;
                var valueAsBool = (bool) value;
    
                if (ParameterString == null || !valueAsBool)
                {
                    try
                    {
                        return Enum.Parse(targetType, "0");
                    }
                    catch (Exception)
                    {
                        return DependencyProperty.UnsetValue;
                    }
                }
                return Enum.Parse(targetType, ParameterString);
            }
        }