使用绑定路径=.正在断开我的绑定

本文关键字:绑定 断开 我的 路径 | 更新日期: 2023-09-27 18:34:08

我正在使用单选按钮,该按钮将数据上下文设置为枚举的观察器集合。当我绑定单选按钮并将路径设置为点时,如下所示,数据绑定在应用程序首次启动时起作用,但随后数据绑定失败。如果有人知道为什么???

   <RadioButton  Content="No Model" FontSize="16" IsChecked= "{Binding Path=SisoModel, Mode=TwoWay, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static local:SISOModels.NoModel}}"/>
            <RadioButton  Content="Prediction Only" FontSize="16" IsChecked="{Binding Path=SisoModel, Mode=TwoWay, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static local:SISOModels.PredictionOnly}}"/>
            <RadioButton  Content="Prediction And Control" FontSize="16" IsChecked="{Binding Path=SisoModel, Mode=TwoWay, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static local:SISOModels.PredictionAndControl}}"/>

转换代码在这里:

[ValueConversion(typeof(Enum), typeof(bool))]
    public class EnumToBooleanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null || parameter == null) return false;
            string enumValue = value.ToString();
            string targetValue = parameter.ToString();
            bool outputValue = enumValue.Equals(targetValue, StringComparison.InvariantCultureIgnoreCase);
            return outputValue;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null || parameter == null) return null;
            bool useValue = (bool)value;
            string targetValue = parameter.ToString();
            if (useValue) return Enum.Parse(targetType, targetValue);
            return null;
        }
    }

模型和视图模式代码如下所示:

公共枚举SISOModels { 无模型, 仅预测, 预测与控制 };

public class SisoModels1 : BindableBase
{
    public SisoModels1(SISOModels _SisoModel)
    {
        SisoModel = _SisoModel;
    }
    public SISOModels SisoModel { get; set; }
}

在基于网格大小的 for 循环中,我写了下面的代码,它将把这些无线电对接用户控件(额外设置)添加到网格的所有单元格中并设置数据上下文:

 AdditionalSetup a1 = new AdditionalSetup();
                        a1.DataContext = vm.sisoModelList[ct];
                        ct++;

使用可观察集合的原因是,我们必须在网格的所有单元格中填充这些单选按钮,并且网格大小在运行时可用。 编译时 不确定我要填充多少个单选按钮。

使用绑定路径=.正在断开我的绑定

如果无法测试,很难确定; 但我非常有信心,ConvertBack结束时的return null正在扼杀你的绑定。

正确的ValueEquals(或EnumToBoolean)转换器是:

public Convert(...)
{
    return value.Equals(parameter);
}
public ConvertBack(...)
{
    if ((bool)value)
       return parameter;
    else
       return Binding.DoNothing; //Not null!!!!
}

Enum类型都是值类型,因此除非您在它们周围放置一个可为 null 的包装器,否则通常不需要 null 检查(不过请随意添加)。

更重要的是,您不应该从此转换器返回 null。请改用Binding.DoNothing

如果您直接ObservableCollection绑定,我猜这也会导致您遇到一些问题,因为它显然不是枚举。