'System.Windows.Data.MultiBinding'不是属性'Text'的有效值

时间:2010-06-15 22:03:55

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

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

我有:

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

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

时,它是如何运作的
<TextBlock>
    <TextBlock.Text>
        <MultiBinding ... />
    </TextBlock.Text>
</TextBlock>

但它不像我那样工作吗?

2 个答案:

答案 0 :(得分:2)

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

的结果 顺便说一句,您在标记扩展中究竟做了什么?如果您不需要覆盖MultiBinding(已密封),也许您可​​以继承ProvideValue。只需设置适当的Converter和其他属性

,您几乎可以实现任何目标

答案 1 :(得分:0)

做了一些调查,事实证明我应该在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 );
}

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

更新:根据serviceProvider中的目标和属性信息,MultiBinding.ProvideValue()将绑定本身挂钩。那更清洁了。