WPF Radiobutton(二)(绑定到布尔值)

时间:2010-07-29 10:10:04

标签: wpf binding radio-button boolean

我有一个boolean类型的属性,带有复选框。

我想将其更改为绑定在同一属性上的两个radiobutton,其值为true / false。

怎么办呢?

8 个答案:

答案 0 :(得分:73)

<RadioButton GroupName="Group1" 
             IsChecked="{Binding PropertyValue}" Content="Yes" />
<RadioButton GroupName="Group1"  Content="No" 
             IsChecked="{Binding PropertyValue, 
                         Converter={StaticResource BoolInverterConverter}}" />
public class BoolInverterConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            return !(bool)value;
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
        System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            return !(bool)value;
        }
        return value;
    }

    #endregion
}

答案 1 :(得分:9)

您可以使用恢复布尔值的值转换器:

使用该转换器,将一个Checkbox.IsChecked属性绑定到没有转换器的布尔值和一个带转换器的CheckBox.IsChecked属性。这应该可以解决问题。

这里是这种转换器的代码。我从here复制了它并添加了一些代码行。在那里你会找到更多关于。

的信息
public class BoolToOppositeBoolConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture) {
        if (targetType != typeof(bool)) {
            throw new InvalidOperationException("The target must be a boolean");
        }
        if (null == value) {
            return null;
        }
                    return !(bool)value;
    }

    public object ConvertBack(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture) {
        if (targetType != typeof(bool)) {
            throw new InvalidOperationException("The target must be a boolean");
        }
        if (null == value) {
            return null;
        }
        return !(bool)value;
    }
} 

要使用它,请在资源部分声明它。

 <local:BoolToOppositeBoolConverter x:Key="BoolToOppositeBoolConverter_ValueConverter"/>

并将其作为静态资源用于绑定:

<CheckBox IsChecked="{Binding YourProperty}" />
<CheckBox IsChecked="{Binding YourProperty,Converter={StaticResource BoolToOppositeBoolConverter_ValueConverter}}" />

请注意,转换器只是一个简单的例子。如果要在生产代码中使用它,请巧妙地实现它。我没有测试过。如果它不起作用,请发表评论。

答案 2 :(得分:7)

标准绑定方法具有解雇绑定设置器的不幸副作用,因为&#34;未选择&#34;每当加载UI时。因此,如果你有代码来处理用户在你的bool的setter中的点击次数,那么它会做一些奇怪的事情,例如将setter发送到&#34; false&#34;即使你已经把它绑定到了一个真实的&#34;布尔。

我使用专门用于单选按钮的转换器解决了这个问题:

public class BoolRadioConverter : IValueConverter
{
    public bool Inverse { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool boolValue = (bool) value;

        return this.Inverse ? !boolValue : boolValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool boolValue = (bool)value;

        if (!boolValue)
        {
            // We only care when the user clicks a radio button to select it.
            return null;
        }

        return !this.Inverse;
    }
}

在您的资源中:

<converters:BoolRadioConverter x:Key="BoolRadioConverter" />
<converters:BoolRadioConverter x:Key="InverseBoolRadioConverter" Inverse="True" />

在你的xaml中:

<RadioButton
    Content="True option"
    GroupName="radioGroup1"
    IsChecked="{Binding MyProperty,
                        Converter={StaticResource BoolRadioConverter}}" />
<RadioButton
    Content="False option"
    GroupName="radioGroup2"
    IsChecked="{Binding MyProperty,
                        Converter={StaticResource InverseBoolRadioConverter}}" />

答案 3 :(得分:3)

如果将两个单选按钮的GroupName属性设置为相同的值(因此当时只能检查一个),则可以在没有转换器的情况下实现此目的。然后,将一个单选按钮的IsChecked设置为“True”,并将另一个单独的IsChecked绑定到您的布尔值。切换单选按钮将更改布尔值,但是,将布尔值更改为False将不会检查其他单选按钮。

谢谢, 弗拉德

答案 4 :(得分:2)

以下是如何使用示例代码将单选按钮绑定到任何类型(枚举,布尔,字符串,整数等)的解决方案:

http://www.codeproject.com/Tips/720497/Binding-Radio-Buttons-to-a-Single-Property

答案 5 :(得分:1)

在使用MVVMLight且在{strong> XAML 中将DataContext设置为:

DataContext="{Binding <Your ViewModel property name>, Source={StaticResource Locator}}" 

BoolInverterConverter导致Stack Overflow第二次打开窗口。

解决方法是从XAML中删除DataContext,并在InitializeComponent()之后在窗口构造函数中的代码中完成该操作:

DataContext = ServiceLocator.Current.GetInstance<Your View Model class>();

经过一些测试后还不够-单击单选按钮时,可能会随机弹出堆栈溢出错误。对我有用的解决方案-代替转换器,为组中的其他单选按钮使用另一个属性:

public bool Is9to1 { get; set; }
public bool Is1to9 { get { return !Is9to1; } set { Is9to1 = !value; } } 

在XAML中:

   <RadioButton GroupName="Is9to1" IsChecked="{Binding Is1to9}"/>
   <RadioButton GroupName="Is9to1" IsChecked="{Binding Is9to1}"/>

答案 6 :(得分:0)

简体版ragunathananswer

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) =>
    Convert(value);

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) =>
    Convert(value);

private object Convert(object value) => 
    value is bool ? !(bool)value : value;

答案 7 :(得分:0)

如果您希望布尔值可为空(无默认值/选中的单选按钮),则对RandomEngy答案的升级很小

public class BoolRadioConverter : IValueConverter
{
    public bool Inverse { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool? boolValue = (bool?)value;

        return this.Inverse ? !boolValue : boolValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool? boolValue = (bool?)value;

        if (boolValue != null && (bool)!boolValue)
        {
            // We only care when the user clicks a radio button to select it.
            return null;
        }

        return !this.Inverse;
    }
}

其余的与他的答案相同。