如何绑定到某个组的 any/none `RadioButton` 是否被选中?

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

如何绑定某个组的any/noneRadioButton是否被勾选?

我有,比如说,4 RadioButtons。最初 none 被选中,因此 "next" 按钮被禁用。用户必须做出选择才能启用 "next" 按钮并能够继续。

第一个解决方案效率不高,因为每个新的 RadioButton 都需要添加额外的 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>

后者又是基于MVVM的。您可以在视图模型中进行检查属性,每当检查任何RadioButton时,它都会将其设置为True,并基于此值设置您的按钮设置其ISENABLED 属性。

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;
}