如何将所有RadioButton IsChecked属性设置为false

时间:2014-10-31 11:30:44

标签: c# wpf radio-button ischecked

我在RadioButtons中有4 UniformGrid

最初它们都设置为false

但是一旦我点击其中一个,就会始终保持真实。

我们的要求是它们都可以设置为false。

我尝试过像

这样的事情
<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding IsChecked,
                   RelativeSource={RelativeSource Self}}" Value="True"/>
        <Condition Binding="{Binding IsPressed,
                   RelativeSource={RelativeSource Self}}" Value="True"/>
    </MultiDataTrigger.Conditions>
    <Setter Property="IsChecked" Value="False"/>
</MultiDataTrigger>

但它没有用。我知道我可以使用ToggleButton,但一次只能检查RadioButtons中的一个。

这甚至可能吗?

3 个答案:

答案 0 :(得分:0)

我可以马上告诉你一个样式不会解决你的问题,因为一旦用户设置了DependencyProperty的值它忽略了样式设置器,你应该阅读Dependency Property Value Precedence

另一方面,当单选按钮具有IsChecked = True时,您可以尝试单独处理鼠标单击,如下所示:

        <RadioButton GroupName="AAA" PreviewMouseLeftButtonDown="RadioButton_PreviewMouseLeftButtonDown"/>

    private void RadioButton_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        RadioButton radioButton = sender as RadioButton;

        if (radioButton != null && radioButton.IsChecked.GetValueOrDefault())
        {
            radioButton.IsChecked = false;
            e.Handled = true;
        }
    }

我认为这可以解决问题。

答案 1 :(得分:0)

您的解决方案仅在实际按下鼠标按钮时有效(尝试按住它,您将看到)。 想到的最简单的方法是改变RadioButton以满足我们的需求:

public class UncheckableRadioButton : RadioButton
{
   protected override void OnToggle()
   {
      if (IsChecked == true)
         IsChecked = false;
      else base.OnToggle();
   }
}

如果再次点击,Theese自定义无线电将取消选中。

答案 2 :(得分:0)

icebat要求时,我会发布我的解决方案:

我只为我的RadioButtons创建了一个事件处理程序,我在其中比较了我的类中定义的某些值:

private int PopupID;
private bool IsPopupActive;
private void RadioButton_Click(object sender, RoutedEventArgs e)
{
    RadioButton rb = (RadioButton)sender;
    string s = (string)rb.Content;
    int id = int.Parse(s);

    if (PopupID == id && IsPopupActive == true)
    {
        foreach (RadioButton rbb in PopupGrid.Children.OfType<RadioButton>())
            rbb.SetValue(RadioButton.IsCheckedProperty, false);

        IsPopupActive = false;
    }
    else if (PopupID != id || IsPopupActive == false)
    {
        foreach (RadioButton rbb in PopupGrid.Children.OfType<RadioButton>()
                .Where(x => x != rb))
            rbb.SetValue(RadioButton.IsCheckedProperty, false);

        IsPopupActive = true;
        PopupID = id;
    }
}

不是像这样的代码隐藏解决方案的忠实粉丝,但它确实有效。