我正在使用单选按钮,其中datacontext设置为observabelcollection的枚举。当我将路径设置为dot的单选按钮绑定到如下所示时,数据绑定首次应用于应用程序,但数据绑定失败。如果有人知道为什么???
<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;
}
}
模型和视图模式代码在这里:
public enum SISOModels { NoModel, PredictionOnly, PredictionAndControl };
public class SisoModels1 : BindableBase
{
public SisoModels1(SISOModels _SisoModel)
{
SisoModel = _SisoModel;
}
public SISOModels SisoModel { get; set; }
}
在基于网格大小的for循环中我写下了代码,它将这些无线电对接用户控件(additionalSetup)添加到网格的所有单元格中并设置datacontext:
AdditionalSetup a1 = new AdditionalSetup();
a1.DataContext = vm.sisoModelList[ct];
ct++;
使用可观察集合的原因是我们必须在网格的所有单元格中填充这些单选按钮,并且网格大小可用于运行时。编译时间不确定我要填充多少个单选按钮。
答案 0 :(得分:0)
无法测试,很难说肯定;但我非常有信心return null
末ConvertBack
正在杀死你的绑定。
正确的 ValueEquals
(或EnumToBoolean
)转换器是:
public Convert(...)
{
return value.Equals(parameter);
}
public ConvertBack(...)
{
if ((bool)value)
return parameter;
else
return Binding.DoNothing; //Not null!!!!
}
Enum
类型是值类型,因此除非你在它们周围放置一个可以为空的包装器,否则通常不需要进行空检查(尽管可以随意添加)。
更重要的是,您应该不从此转换器返回null。请改用Binding.DoNothing
。
如果您直接绑定 ObservableCollection
,我猜这也会导致一些问题,因为它显然不是枚举。