【问题标题】:'System.Windows.Data.MultiBinding' is not a valid value for property 'Text'“System.Windows.Data.MultiBinding”不是属性“Text”的有效值
【发布时间】:2010-06-15 22:03:55
【问题描述】:

我正在尝试编写一个自定义的MarkupExtension,它允许我使用我自己的机制来定义绑定,但是当我尝试从我的MarkupExtension 返回一个MultiBinding 时,我得到了上述异常。

我有:

<TextBlock Text="{my:CustomMarkup ...}" />

CustomMarkup 返回MultiBinding,但显然Text 不喜欢设置为MultiBinding。当我说:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding ... />
    </TextBlock.Text>
</TextBlock>

但它不像我那样工作?

【问题讨论】:

    标签: c# wpf data-binding multibinding markup-extensions


    【解决方案1】:

    不要返回 MultiBinding 本身。而是返回MultiBinding.ProvideValue 的结果。

    顺便说一句,您在标记扩展中到底在做什么?如果您不需要覆盖ProvideValue(已密封),也许您可​​以从MultiBinding 继承。只需设置适当的Converter 和其他属性,您几乎可以实现任何目标

    【讨论】:

    • 正是我要写的,但你打败了我。
    • 有趣。我的自定义扩展本质上为我提供了一种将绑定定义为我的代码隐藏中的方法的结果的方法,并从我附加到该方法的自定义属性中获取绑定的依赖项。如果我自己不这么说,那就太酷了。 :) 如果它最终运作良好,我正在考虑发布它。
    【解决方案2】:

    做了一些调查,结果发现我应该在 MarkupExtension 的 ProvideValue 方法中实际设置绑定,然后返回绑定的当前值。有点违反直觉,但到目前为止似乎有效!

    这大概是我最终得到的结果:

    public override object ProvideValue( IServiceProvider serviceProvider ) {
        IProvideValueTarget valueProvider = (IProvideValueTarget)serviceProvider.GetService( typeof( IProvideValueTarget ) );
        // only need to do this if they're needed in your logic:
        object @target = valueProvider.TargetObject;
        object @property = valueProvider.TargetProperty;
    
        MultiBinding result = new MultiBinding();
    
        // set up binding as per custom logic...
    
        return result.ProvideValue( serviceProvider );
    }
    

    添加一点逻辑,轻轻地处理错误并提供服务。

    更新: 结果表明 MultiBinding.ProvideValue() 根据 serviceProvider 中的目标和属性信息连接了绑定本身。这样干净多了。

    【讨论】:

    • 我认为 MultiBinding.ProvideValue 已经执行了 BindingOperations.SetBinding... 所以你做了两次
    • P.S.我只是使用“@”符号让变量看起来很特别……没有任何功能用途。
    • 等等,怎么可能?在我设置之前它不知道绑定是什么。
    • 哦,我明白了,它是从 serviceProvider 那里得到的……很有趣。
    • 你做的太多了。要获取绑定集,您只需从 ProvideValue 中返回一个 BindingExpressionBase(不是 BindingBase)。
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多