首页 > 解决方案 > 从转换器返回一个可空的布尔值到 XAML

问题描述

我有一组三个单选按钮绑定到一个可为空的布尔值。我已经编写了转换器,但我不确定如何编写 ConvertBack?当我打开窗口时,选择了该组的多个选项。

转换器类:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    switch ((string)parameter)
    {
        case "Pass":
            return true;
        case "Fail":
            return false;
        case "NotComplete":
            return null;
        default:
            return null;
    }
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    switch ((bool?)value)
    {
        case true:
            return "Pass";
        case false:
            return "Fail";
        case null:
            return "NotComplete";
        default:
            return "NotComplete";
    }
}

XAML 中的单选按钮:

<RadioButton GroupName="GroupOneRadioButton" IsEnabled="{Binding CanPassGroupOneTest}" IsChecked="{Binding GroupOneTestResult, Converter={StaticResource radioButtonConverter}, ConverterParameter=Pass}" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" />
<RadioButton GroupName="GroupOneRadioButton" IsEnabled="{Binding CanPassGroupOneTest}" IsChecked="{Binding GroupOneTestResult, Converter={StaticResource radioButtonConverter}, ConverterParameter=Fail}"  Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center" />
<RadioButton GroupName="GroupOneRadioButton" IsEnabled="{Binding CanPassGroupOneTest}" IsChecked="{Binding GroupOneTestResult, Converter={StaticResource radioButtonConverter}, ConverterParameter=NotComplete}"  Grid.Row="1" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center" />

更多细节:

很抱歉一开始不清楚。希望这能解释:

标签: c#.netwpfdata-binding

解决方案


将组中的多个 RadioButton 绑定到单个属性需要在 Binding Converter 中进行特殊处理。

ConvertBack 方法应仅在选中 RadioButton 时返回一个值,以避免自动取消选中其他按钮会产生任何进一步的影响。

除此之外,Convert 方法必须value根据parameter字符串将传递的值与三个可能的值进行比较。

public object Convert(
    object value, Type targetType, object parameter, CultureInfo culture)
{
    switch ((string)parameter)
    {
        case "Pass":
            return (bool?)value == true;
        case "Fail":
            return (bool?)value == false;
        default:
            return (bool?)value == null;
    }
}

public object ConvertBack(
    object value, Type targetType, object parameter, CultureInfo culture)
{
    if ((bool)value)
    {
        switch ((string)parameter)
        {
            case "Pass":
                return (bool?)true;
            case "Fail":
                return (bool?)false;
            default:
                return (bool?)null;
         }
    }

    return Binding.DoNothing;
}

推荐阅读