有一种情况,UI中的复选框需要绑定到数字参数 - 实际上,某些值使复选框为“true”,否则为“false”。
最简单的方法是使用转换器:
[ValueConversion(typeof(int), typeof(bool?))]
public class TypeToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (targetType != typeof(bool?))
throw new InvalidOperationException("The target must be a bool");
if( (value < 3)
{
return true;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplmentedExpection();
}
}
然后在XAML中:
<CheckBox IsChecked="{Binding Path=Type.TypeID, Converter={StaticResource TypeConverter}}" />
当使用Convert时,它就像魅力一样,但在使用ConvertBack时完全失败,因为它需要知道数值是什么(它取决于其他UI元素)才能知道要返回的数字 - 实际上它需要访问绑定对象。
我假设我可以使用ConverterParameter执行此操作,但从事物的外观来看,您无法将值绑定到此属性。
有没有办法解决这个烂摊子?
编辑:我已经通过搞乱原始绑定解决了这个问题,并且放弃了它,因为取消选中我想要做的就是删除项目。但是我将把它留在原处,因为它似乎是一个有效的问题,我对可能的解决方案感到好奇。答案 0 :(得分:5)
为什么不绑定某些内容并按照绑定的方式完成工作,例如viewmodel?它可能会更清洁,更快。
转换器在理论上很不错,但是在构建了许多大型WPF项目后,我几乎从不使用它们,原因如上所述。当然,你可以让它做你想做的,但重点是什么?您对这些转换发生的方式和时间的控制要少得多。