«System.windows.data.multibinding» не является допустимым значением для свойства «текст»
-
27-09-2019 - |
Вопрос
Я пытаюсь написать обычай 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
. Отказ Это намного чище.