ashish g
ashish g

Reputation: 449

Bind Xaml Radio button to boolean

I saw many posts on how to bind a boolean value to a radio button. But my scenario is that I need to bind it to a radio button and read the selection from the user.

That is no option should be selected intially.

If I bind it to a boolean, since boolean cant be null it shows the default value selected in radio button.

If I use nullable boolean, I still defaults to false when trying to use the converter.

I cant use oneway mode in xaml as I need to check if the radio button selection was made which I do using the bounded variable.

Ant pointers on how to achieve this?

Upvotes: 6

Views: 8852

Answers (2)

ChrisF
ChrisF

Reputation: 137108

You can bind a nullable boolean to your radio buttons, but you need to do it through a converter.

First declare your variable:

private bool? answer;
public bool? Answer
{
    get { return answer; }
    set
    {
        answer = value;
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Answer"));
    }
}

and initialise it to null.

Then in the XAML:

<Window.Resources>
    <local:BooleanConverter x:Key="BooleanConverter"/>
</Window.Resources>

<StackPanel Grid.Row="1">
    <RadioButton Content="I Agree"
                 IsChecked="{Binding Answer,
                             Converter={StaticResource BooleanConverter},
                             ConverterParameter='true', Mode=TwoWay}" />
    <RadioButton Content="I Disagree"
                 IsChecked="{Binding Answer,
                             Converter={StaticResource BooleanConverter},
                             ConverterParameter='false', Mode=TwoWay}" />
</StackPanel>

And finally your converter:

class BooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var test = (bool?)value;
        var result = bool.Parse((string)parameter);

        if (test == result)
        {
            return true;
        }

        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var result = bool.Parse((string)parameter);
        return result;
    }
}

This binds the radio button to Answer and states that the first one will only be checked when the value is true and the second one will be checked when the answer is false. You can then check that Answer is not null before letting the user proceed.

Upvotes: 10

BaconSah
BaconSah

Reputation: 421

This may not be the best way of doing it, but you could use something similar to this: checkbox like radiobutton wpf c# and just have two controls.

I appreciate it's not the best, but reading your answer it gives you what you want (generally).

Upvotes: 0

Related Questions