«System.windows.data.multibinding» не является допустимым значением для свойства «текст»

StackOverflow https://stackoverflow.com/questions/3049398

Вопрос

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

У меня есть:

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

CustomMarkup Возвращает А. MultiBinding, но видимо Text не нравится быть установленным на MultiBinding. Отказ Как это работает, когда я говорю:

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top