绑定到单选按钮

时间:2011-07-15 19:30:46

标签: wpf radio-button bind

我将以下单选按钮绑定到变量IsAllowed

<RadioButton Name="YesRadioButton" Margin="5,5,0,0" IsChecked="{Binding Path=IsAllowed, Mode=TwoWay}">Yes</RadioButton>

如何仅使用XAML使No按钮取相反的值?

4 个答案:

答案 0 :(得分:4)

你不需要。它会在默认情况下发生。

请确保IsAllowedtrue开头,其余的将照顾自己。

这是因为当您单击No按钮时,它会自动设置Yes按钮的选中值(这就是单选按钮的工作方式),因此更改将自动发生,您支持类将更新。

更好:只需使用复选框即可。是/否情况是他们的目的。

答案 1 :(得分:3)

没有仅限Xaml的解决方案。你可以使用反向bool转换器绑定No。

<local:NotConverter x:Key="notConverter"/>

{Binding IsAllowed, Mode=TwoWay, Converter=notConverter} 

public class NotConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Boolean result = false;
        if (value is Boolean)
            result = !((Boolean)value);
        return result;
    }

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

答案 2 :(得分:1)

您必须使用IValueConverter编写转换器。以下是如何执行此操作的示例WPF - Bind to Opposite Boolean Value Using a Converter

答案 3 :(得分:1)

上面的答案有效,但我想要一个适用于Yes和No单选按钮的转换器,并反映可空的布尔值。所以我做出了利用转换器参数的替代方案:

public class YesNoRadioButtonToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return CompareValueWithRequiredValueToBeChecked(value, parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return CompareValueWithRequiredValueToBeChecked(value, parameter);
    }

    private bool CompareValueWithRequiredValueToBeChecked(object value, object parameterValue)
    {
        bool? convertedValue = ConvertObjectToBool(value);
        bool? convertedParameter = ConvertObjectToBool(parameterValue);

        bool result = convertedValue == convertedParameter;

        return result;
    }

    private bool? ConvertObjectToBool(object parameter)
    {
        string stringResult = parameter == null ? null : parameter.ToString();
        bool? convertedResult;

        bool convertResultTest = false;
        if (stringResult != null && !bool.TryParse(stringResult, out convertResultTest))
        {
            throw new InvalidCastException(string.Format("Cannot convert {0} to a bool.", parameter));
        }

        convertedResult = stringResult == null ? (bool?)null : (bool?)convertResultTest;

        return convertedResult;
    }
}

以下是XAML的样子:

    <converters:YesNoRadioButtonToBooleanConverter x:Key="yesNoToBool" />

    <RadioButton Content="Yes" Name="radYes" GroupName="Group1" IsChecked="{Binding Path=boolProperty1, Mode=TwoWay, Converter={StaticResource yesNoToBool}, ConverterParameter=true}" />
    <RadioButton Content="No" Name="radNo" GroupName="Group1" IsChecked="{Binding Path=boolProperty1, Mode=TwoWay, Converter={StaticResource yesNoToBool}, ConverterParameter=false}" />