1

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

我有:

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

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

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

但它不像我这样做的方式工作?

4

2 回答 2

2

不要返回MultiBinding本身。相反,返回MultiBinding.ProvideValue.

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

于 2010-06-15T22:43:30.477 回答
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 );
}

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

更新:原来 MultiBinding.ProvideValue() 根据serviceProvider. 这样干净多了。

于 2010-06-15T22:42:51.880 回答