开发者

'System.Windows.Data.MultiBinding' is not a valid value for property 'Text'

开发者 https://www.devze.com 2023-01-03 09:14 出处:网络
I\'m trying to write a custom MarkupExtension that allows me to use my own mechanisms for defining a binding, however when I attempt to return a MultiBinding from my MarkupExtension I get the above ex

I'm trying to write a custom MarkupExtension that allows me to use my own mechanisms for defining a binding, however when I attempt to return a MultiBinding from my MarkupExtension I get the above exception.

I have:

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

CustomMarkup returns a MultiBinding, but apparently Text doesn't like being set to a MultiBinding. How come it works when I say:

<TextBlock>
    <TextB开发者_高级运维lock.Text>
        <MultiBinding ... />
    </TextBlock.Text>
</TextBlock>

But it doesn't work the way I'm doing it?


Don't return the MultiBinding itself. Instead, return the result of MultiBinding.ProvideValue.

BTW, what exactly are you doing in your markup extension ? Perhaps you could just inherit from MultiBinding, if you don't need to override ProvideValue (which is sealed). You can achieve almost anything by just setting the appropriate Converter and other properties


Did some investigating, and it turns out I'm supposed to actually set the binding in the MarkupExtension's ProvideValue method and then return the current value of the binding. A little counter-intuitive but so far seems to be working!

Here's roughly what I ended up with:

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 );
}

Add a little logic, dust lightly with error handling and serve.

Update: Turns out MultiBinding.ProvideValue() hooks up the binding itself, based on the target and property information in serviceProvider. That's much cleaner.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号