选中其他复选框时取消选中复选框

时间:2017-01-17 17:28:15

标签: wpf checkbox

我有两个checkboxes。当我检查一个时,我希望另一个取消选中当前是否已检查。两者都可以不受控制。目前,我可以检查一个,但当我检查另一个时,两个都取消选中。我无法弄清楚原因。

注意:如果可能,我想在.xaml中完成所有操作。到目前为止,我一直在搞乱数据触发器以获得正确的效果而没有运气。

<CheckBox Name="SYOChkBox">
    <CheckBox.Style>
        <Style TargetType="CheckBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked, ElementName=UTMChkBox}"
                             Value="True">
                    <Setter Property="IsChecked"
                            Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </CheckBox.Style>
</CheckBox>
<CheckBox Name="UTMChkBox">
    <CheckBox.Style>
        <Style TargetType="CheckBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked, ElementName=SYOChkBox}"
                             Value="True">
                    <Setter Property="IsChecked"
                            Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </CheckBox.Style>
</CheckBox>

2 个答案:

答案 0 :(得分:3)

您应该 真的 使用ViewModel来执行此操作(我将留下一段代码,说明如何使用VM完成此操作的帖子)。

无论如何,这是我只能用XAML做的事情

使用CheckBox

使用这种方法的问题是,当两者都被选中时,两个触发器都将被触发(??),并且两者都将被取消选中。所以,我猜你能做的就是:

Output

检查CheckBox X时,

CheckBox Y通常会取消选中,CheckBox X只检查CheckBox Y时不会检查。

    <CheckBox Name="SYOChkBox">
    <CheckBox.Style>
        <Style TargetType="CheckBox">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding IsChecked, ElementName=UTMChkBox}" Value="True" />
                        <Condition Binding="{Binding IsChecked, ElementName=SYOChkBox}" Value="True" />
                    </MultiDataTrigger.Conditions>

                    <Setter Property="IsChecked" Value="False" />
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </CheckBox.Style>
</CheckBox>
<CheckBox Name="UTMChkBox" />

使用RadioButton

我知道这不是你问的问题,但作为一种消化,你可以使用RadioButton,代码会更清晰:

RadioButton alternative

<RadioButton>Option A</RadioButton>
<RadioButton>Option B</RadioButton>
<RadioButton>None</RadioButton>

使用ViewModel

XAML

<CheckBox IsChecked="{Binding IsChecked_CheckBoxA}" />
<CheckBox IsChecked="{Binding IsChecked_CheckBoxB}" />

代码隐藏:

private bool _IsChecked_CheckBoxA;
private bool _IsChecked_CheckBoxB;

public bool IsChecked_CheckBoxA
{
    get
    {
        return _IsChecked_CheckBoxA;
    }
    set
    {
        if (value)
            IsChecked_CheckBoxB = false;

        _IsChecked_CheckBoxA = value;
        NotifyPropertyChanged();
    }
}
public bool IsChecked_CheckBoxB
{
    get
    {
        return _IsChecked_CheckBoxB;
    }
    set
    {
        if (value)
            IsChecked_CheckBoxA = false;

        _IsChecked_CheckBoxB = value;
        NotifyPropertyChanged();
    }
}

答案 1 :(得分:1)

正如其他人所说,它可能不仅仅在xaml中可行,并且建议使用viewmodel。所以这就是我的工作:

的Xaml:

<CheckBox Name="SYOChkBox"
          IsChecked="{Binding IsCheckedSYO}" />
<CheckBox Name="UTMChkBox"
          IsChecked="{Binding IsCheckedUTM}" />

视图模型:

private bool _isCheckedSYO;
public bool IsCheckedSYO
{
    get { return _isCheckedSYO; }
    set 
    {
        if (true == value) //if checked
        {
            IsCheckedUTM = false; //uncheck the UTM check box
            _isCheckedSYO = value;
        }
        else
        {
            _isCheckedSYO = value;
        }
        OnPropertyChanged("IsCheckedSYO");
    }
}

private bool _isCheckedUTM;
public bool IsCheckedUTM
{
    get { return _isCheckedUTM; }
    set
    {
        if (true == value) //if checked
        {
            IsCheckedSYO = false; //uncheck the SYO checkbox
            _isCheckedUTM = value;
        }
        else
        {
            _isCheckedUTM = value;
        }
        OnPropertyChanged("IsCheckedUTM");
    }
}