【问题标题】:Returning a Nullable Bool from Converter to XAML从转换器返回一个可空的布尔值到 XAML
【发布时间】:2019-12-11 11:55:12
【问题描述】:

我有一组三个单选按钮绑定到一个可为空的布尔值。我已经编写了转换器,但我不确定如何编写 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" />

更多细节:

抱歉一开始不清楚。希望这可以解释:

  • GroupOneTestResult 是一个 Nullable 布尔值,定义为:

    public bool? GroupOneTestResult { get; set; }

  • 在 XAML 中有三个单选按钮 - Pass、Failed、Not Complete,作为一个组我想绑定到 GroupOneTestResult(按钮一,通过,绑定到 True。按钮二,失败,绑定到 false。按钮三,Not Complete,绑定到null)

  • 当在XAML中点击组中的按钮时,需要在GroupOneTestResult中存储正确的值

  • GroupOneTestResult 需要以编程方式更改(例如,在加载测试结果时),并且该值由自动选择的 RadioButton 反映。

  • 我有一个 Converter 类,在我的第一次尝试中,它会从 XAML 中获取 ConverterParameter 并获取正确的布尔值。这是行不通的。我不确定如何执行上述操作。

【问题讨论】:

  • Convert 方法根本不转换 Binding 的源属性的值。假设GroupOneTestResult 返回适当的字符串,将switch ((string)parameter) 更改为switch ((string)value)。并从所有 Bindings 中删除 ConverterParameter 设置。
  • 那我是不是搞错了?我希望 bool 为 True、False 或 Null,具体取决于选择的单选按钮分别为 Passed、Failed 或 Not Completed。然而,ViewModel 中的一些代码也需要能够更新单选按钮(因此,如果加载了结果,例如,选择了正确的单选按钮)
  • 对不起,如果我有错误的想法;我对此还是很陌生
  • 如前所述,如果 GroupOneTestResult 属性会返回这些字符串(我们不知道,因为您没有告诉我们),那么 Convert 方法应该打开 value,而不是 @987654329 @,并且根本不应该有 ConverterParameter。 ConvertBack 应该可以正常工作。
  • 抱歉,您的问题需要更多细节。 GroupOneTestResult 属性到底是什么?它是如何声明的? RadioButton 应该做什么?

标签: c# .net wpf data-binding


【解决方案1】:

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

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

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

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;
}

【讨论】:

    猜你喜欢
    • 2018-01-24
    • 1970-01-01
    • 2014-07-14
    • 2012-12-06
    • 1970-01-01
    • 2021-03-21
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多