我正在尝试编写一个自定义MarkupExtension
,允许我使用自己的机制来定义绑定,但是当我尝试从我的MultiBinding
返回MarkupExtension
时,我得到了以上例外。
我有:
<TextBlock Text="{my:CustomMarkup ...}" />
CustomMarkup
会返回MultiBinding
,但显然Text
不喜欢被设置为MultiBinding
。当我说:
<TextBlock>
<TextBlock.Text>
<MultiBinding ... />
</TextBlock.Text>
</TextBlock>
但它不像我那样工作吗?
答案 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()将绑定本身挂钩。那更清洁了。