使用绑定路径=.正在断开我的绑定
本文关键字:绑定 断开 我的 路径 | 更新日期: 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
绑定,我猜这也会导致您遇到一些问题,因为它显然不是枚举。