将Xaml单选按钮绑定到布尔值

6
我看到很多关于如何将布尔值绑定到单选按钮的帖子。但是我的情况是我需要将它绑定到单选按钮并从用户那里读取选择。
也就是说,初始状态下不应选择任何选项。
如果我将其绑定到布尔值,由于布尔值不能为null,它会显示单选按钮中的默认值。
如果我使用可空布尔值,在尝试使用转换器时仍会默认为false。
我无法在xaml中使用单向模式,因为我需要检查是否进行了单选按钮选择,这是使用绑定变量进行的。
有什么方法可以实现这一点吗?

如果它是一个布尔值,为什么你想要绑定到单选按钮?复选框不是更好吗? - ChrisF
我考虑了复选框,但它不会给我同样的问题吗?selectedvalue绑定到布尔值,使用转换器也会有相同的问题吗? - ashish g
不。当布尔值为false时,复选框为空。当为true时,它被选中。您还可以将其绑定到可空布尔值,并将其作为复选框的第三个未确定状态。您在这里想要实现什么?这个布尔值代表什么? - ChrisF
抱歉。我正在进行一个是/否问卷调查,用户需要回答是或否。 - ashish g
2个回答

10

您可以将可空布尔值绑定到单选按钮上,但需要通过转换器进行操作。

首先声明您的变量:

private bool? answer;
public bool? Answer
{
    get { return answer; }
    set
    {
        answer = value;
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Answer"));
    }
}

并将其初始化为 null

然后在 XAML 中:

<Window.Resources>
    <local:BooleanConverter x:Key="BooleanConverter"/>
</Window.Resources>

<StackPanel Grid.Row="1">
    <RadioButton Content="I Agree"
                 IsChecked="{Binding Answer,
                             Converter={StaticResource BooleanConverter},
                             ConverterParameter='true', Mode=TwoWay}" />
    <RadioButton Content="I Disagree"
                 IsChecked="{Binding Answer,
                             Converter={StaticResource BooleanConverter},
                             ConverterParameter='false', Mode=TwoWay}" />
</StackPanel>

最后是您的转换器:

class BooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var test = (bool?)value;
        var result = bool.Parse((string)parameter);

        if (test == result)
        {
            return true;
        }

        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var result = bool.Parse((string)parameter);
        return result;
    }
}

这将单选按钮绑定到 Answer,并说明只有在值为true时才会选中第一个,当答案是false时才会选中第二个。然后您可以在允许用户继续之前检查Answer不为空。


谢谢...我正在使用完全相同的东西,但由于某种原因,在我的视图加载之前布尔值被设置为false。我以为是转换器的问题。我会检查发生了什么并回来。 - ashish g
1
@ashishg - 确保在构造函数中将可空布尔值明确设置为 null - ChrisF
这个可以运行了。问题在于我使用了一些其他地方定义过但是在这里也可用的相同变量名,每次视图加载时它都会被更新。 - ashish g

0

这可能不是最好的方法,但你可以使用类似于这样的东西: checkbox like radiobutton wpf c# 然后只需要两个控件。

我知道这不是最好的,但是阅读你的答案后,它能够给你想要的结果(通常情况下)。


我考虑过在选中/取消选中时触发事件并执行它,但是我认为这不是一个好的解决方案,所以我在这里发布了它,看看是否有更好的方法。 - ashish g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接