'System.Windows.Data.MultiBinding' не является допустимым значением для свойства 'Text' - PullRequest
1 голос
/ 16 июня 2010

Я пытаюсь написать пользовательский MarkupExtension, который позволяет мне использовать мои собственные механизмы для определения привязки, однако, когда я пытаюсь вернуть MultiBinding из моего MarkupExtension, я получаю указанное выше исключение.

У меня есть:

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

CustomMarkup возвращает MultiBinding, но, по-видимому, Text не нравится, когда он установлен на MultiBinding.Почему это работает, когда я говорю:

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

Но это не работает так, как я это делаю?

Ответы [ 2 ]

2 голосов
/ 16 июня 2010

Не возвращайте MultiBinding сам.Вместо этого верните результат MultiBinding.ProvideValue.

Кстати, что именно вы делаете в своем расширении разметки?Возможно, вы могли бы просто наследовать от MultiBinding, если вам не нужно переопределять ProvideValue (который запечатан).Вы можете достичь практически чего угодно, просто установив соответствующие Converter и другие свойства

0 голосов
/ 16 июня 2010

Провел некоторые исследования, и оказалось, что я должен установить привязку в методе ProvideValue MarkupExtension, а затем вернуть текущее значение привязки. Немного нелогично, но пока что похоже на работу!

Вот примерно то, чем я закончил:

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. Это намного чище.

...