为啥 MultiBinding 不适用于 CornerRadius
Posted
技术标签:
【中文标题】为啥 MultiBinding 不适用于 CornerRadius【英文标题】:Why does the MultiBinding not work for CornerRadius为什么 MultiBinding 不适用于 CornerRadius 【发布时间】:2012-03-03 16:49:49 【问题描述】:如果我使用 IValueConverter
它可以工作,而 IMultiValueConverter
返回相同的值却不能,这是为什么呢?
<Border Background="Red" Width="100" Height="100"
CornerRadius="Binding Converter=vc:SingleAndMultiConverter" />
<Border Background="Red" Width="100" Height="100"
CornerRadius="MultiBinding Converter=vc:SingleAndMultiConverter" />
public class SingleAndMultiConverter : MarkupExtension, IValueConverter, IMultiValueConverter
public override object ProvideValue(IServiceProvider serviceProvider)
return this;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
return Convert();
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
return Convert();
private object Convert()
return 15;
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
throw new NotSupportedException();
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
throw new NotSupportedException();
多重绑定抛出此错误:
BindingExpression 生成的值对目标属性无效。;值='15'
【问题讨论】:
您做错了,但没有向我们显示任何相关代码... 嘿先生,这几乎是我所有的代码。好的,如果你想阅读ide生成的代码。 现在,你能帮我摆脱这个麻烦吗? 不,因为您甚至没有解释如何它不起作用。 @H.B.您可以加载它并查看它是否引发错误。 BindingExpression 产生的值对目标属性无效。值='15'。我认为正在发生的是 Multi 正在返回一个字符串。但是 [ValueConversion(typeof(object[]),typeof(double))] 没有修复它。 【参考方案1】:Border.CornerRadius
的类型为 CornerRadius
。值转换器应始终为属性返回正确的类型。
很难说它们为什么会有不同的行为,大概是因为某些无法解释的原因在使用多重绑定时没有使用type converters 进行默认值转换。如果您要深入研究源代码,您可能会发现一些东西,但这可能不会是一次愉快的旅程。
【讨论】:
我遇到了与 OP 注意到的完全相同的观察结果。会不会是在使用IValueConverter
转换值之后调用默认类型转换器,而不是在IMultiValueConverter
之后调用? :/ 我对这种无证行为感到有点困惑。【参考方案2】:
什么 H.B.说+1
[ValueConversion(typeof(object[]),typeof(CornerRadius))]
public class Multi : IMultiValueConverter
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
return new CornerRadius(Double.Parse("15"));
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
throw new NotImplementedException();
【讨论】:
先把 15 变成一个字符串然后再解析它背后的逻辑是什么? (在原始代码中它不是字符串) 哦,是的,结果不一致,所以我很困惑。但是 [attributes] 是有效的。 正如我在评论中所说,我认为 multi 正在返回一个字符串,但 single 不是。我使用该 ctor 进行 double 以使输入清晰。 @Blam:那不是构造函数。以上是关于为啥 MultiBinding 不适用于 CornerRadius的主要内容,如果未能解决你的问题,请参考以下文章
为啥 UITableViewAutomaticDimension 不适用于 sectionFooterHeight?