如何绑定是否选择了某个组的任何/ none`RadioButton`?

时间:2015-07-07 12:01:35

标签: c# wpf xaml binding

如何判断是否检查了某个组的任何/无RadioButton

我有,例如,4 RadioButton s。最初没有一个被检查,所以" next"按钮被禁用。用户必须进行选择才能启用" next"按钮,然后才能继续。

1 个答案:

答案 0 :(得分:1)

第一种解决方案效率不高,因为每个新的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。您在ViewModel中创建属性IsChecked,每当检查任何RadioButton时,它将IsChecked值设置为True,并且基于此值的Button设置其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>

<强>视图模型

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