2010-06-15 127 views
1

我试图编写自定义MarkupExtension,它允许我使用自己的机制来定义绑定,但是当我尝试返回我的MarkupExtensionMultiBinding我收到上述例外。'System.Windows.Data.MultiBinding'不是属性'Text'的有效值

我:

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

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

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

但是它不能正常工作吗?

回答

2

不要归还MultiBinding本身。相反,返回MultiBinding.ProvideValue的结果。

顺便说一句,你在做什么标记扩展?也许你可以继承MultiBinding,如果你不需要覆盖ProvideValue(这是密封的)。你可以通过设置合适的Converter和其他属性来实现几乎任何事情

+0

正是我要写的东西,但你打败了我。 – 2010-06-15 22:49:42

+0

有趣。我的自定义扩展实际上给了我一种方法来在我的代码隐藏中定义绑定作为方法的结果,并从我附加到方法的自定义属性获取绑定的依赖关系。如果我自己不这样说,这很酷。 :) 我正在考虑发布它,如果它最终工作出色。 – devios1 2010-06-15 22:51:59

+0

我在MIT许可下发布了我的自定义扩展:http://hip.codeplex.com/ – devios1 2010-06-26 06:42:37

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中的目标和属性信息挂钩了绑定本身。这更干净。

+0

我认为MultiBinding.ProvideValue已经执行BindingOperations.SetBinding ...所以你做了两次 – 2010-06-15 22:44:26

+0

P.S.我只是使用'@'符号来使变量看起来特殊......不起作用。 – devios1 2010-06-15 22:44:38

+0

等一下,怎么可能?直到我设置它才知道绑定是什么。 – devios1 2010-06-15 22:45:34

相关问题