1

我有 4RadioButtonsUniformGrid

最初它们都设置为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>

但它不起作用。我知道我可以使用 a ToggleButton,但一次只能RadioButtons检查其中一个。

这甚至可能吗?

4

3 回答 3

1

我可以立即告诉您,样式无法解决您的问题,因为一旦用户设置了 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;
        }
    }

我认为这可以解决问题。

于 2014-10-31T12:27:36.673 回答
0

您的解决方案仅在实际按下鼠标按钮时才有效(尝试按住它,您会看到)。想到的最简单的方法是进行一些更改RadioButton以适应我们的需要:

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

如果再次单击,这些自定义收音机将取消选中。

于 2014-10-31T12:29:28.257 回答
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;
    }
}

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

于 2014-10-31T13:09:02.283 回答