为啥 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?

为啥排序不适用于矢量?

为啥相等检查不适用于数组[重复]

为啥 QGridLayout 不适用于 QLabel

为啥 RegisterMessageHandler 不适用于特定主题名称?

为啥 ExcludeFromPackageFolders 不适用于 msbuild?