'System.Windows.Data.MultiBinding'不是属性'Text'的有效值
问题描述:
我试图编写自定义MarkupExtension
,它允许我使用自己的机制来定义绑定,但是当我尝试返回我的MarkupExtension
的MultiBinding
我收到上述例外。'System.Windows.Data.MultiBinding'不是属性'Text'的有效值
我:
<TextBlock Text="{my:CustomMarkup ...}" />
CustomMarkup
返回MultiBinding
,但显然Text
不喜欢被设置为MultiBinding
。当我说:
<TextBlock>
<TextBlock.Text>
<MultiBinding ... />
</TextBlock.Text>
</TextBlock>
但是它不能正常工作吗?
答
不要归还MultiBinding
本身。相反,返回MultiBinding.ProvideValue
的结果。
顺便说一句,你在做什么标记扩展?也许你可以继承MultiBinding
,如果你不需要覆盖ProvideValue
(这是密封的)。你可以通过设置合适的Converter
和其他属性来实现几乎任何事情
答
做了一些调查,事实证明我应该在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-15 22:49:42
有趣。我的自定义扩展实际上给了我一种方法来在我的代码隐藏中定义绑定作为方法的结果,并从我附加到方法的自定义属性获取绑定的依赖关系。如果我自己不这样说,这很酷。 :) 我正在考虑发布它,如果它最终工作出色。 – devios1 2010-06-15 22:51:59
我在MIT许可下发布了我的自定义扩展:http://hip.codeplex.com/ – devios1 2010-06-26 06:42:37