Tar
Tar

Reputation: 9015

How can I bind to whether any/none `RadioButton` of a certain group is selected?

How can I bind to whether any/none RadioButton of a certain group is checked?

I have, say, 4 RadioButtons. Initially none of them is checked, so the "next" button is disabled. User must make a selection in order to enable the "next" button and be able to proceed.

Upvotes: 0

Views: 67

Answers (1)

Maximus
Maximus

Reputation: 3448

First solution is not efficient since every new RadioButton entails to add extra DataTrigger:

  <StackPanel>
    <RadioButton Name="x1"/>
    <RadioButton Name="x2"/>
    <RadioButton Name="x3"/>
    <RadioButton Name="x4"/>
    <Button Content="Click">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="IsEnabled" Value="False"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=x1, Path=IsChecked}" Value="True">
                        <Setter Property="IsEnabled" Value="True"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=x2, Path=IsChecked}" Value="True">
                        <Setter Property="IsEnabled" Value="True"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=x3, Path=IsChecked}" Value="True">
                        <Setter Property="IsEnabled" Value="True"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=x4, Path=IsChecked}" Value="True">
                        <Setter Property="IsEnabled" Value="True"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
</StackPanel>

Latter in turn is based on MVVM. You create property IsChecked in your ViewModel and whenever any RadioButton is checked it sets IsChecked value to True and your Button based on this value sets its IsEnabled property.

XAML:

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="RadioButton">
            <Setter Property="Command" Value="{Binding RadioButtonCheckedCommand}"/>
        </Style>
    </StackPanel.Resources>
    <RadioButton Name="x1"/>
    <RadioButton Name="x2"/>
    <RadioButton Name="x3"/>
    <RadioButton Name="x4"/>
    <Button Content="Click" IsEnabled="{Binding IsChecked}"/>
</StackPanel>

ViewModel:

    class MainViewModel : INotifyPropertyChanged
{
    private bool _isChecked;

    public bool IsChecked
    {
        get { return _isChecked; }
        set
        {
            _isChecked = value;
            OnPropertyChanged();
        }
    }

    private RelayCommand _radioButtonCheckedCommand;

    public RelayCommand RadioButtonCheckedCommand
    {
        get
        {
            return _radioButtonCheckedCommand ??
                   (_radioButtonCheckedCommand = new RelayCommand(() => IsChecked = true));
        }
    }

    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Upvotes: 1

Related Questions