Как установить пользовательский MarkupExtension
из кода?
Вы можете легко установить, если из Xaml. То же самое касается Binding
и DynamicResource
.
<TextBox FontSize="{Binding MyFontSize}"
Style="{DynamicResource MyStyle}"
Text="{markup:CustomMarkup}"/>
Установка одинаковых значений через код требует немного другого подхода
Binding: Использовать textBox.SetBinding или BindingOperations.SetBinding
Binding binding = new Binding("MyFontSize");
BindingOperations.SetBinding(textBox, TextBox.FontSizeProperty, binding);
DynamicResource: Использовать SetResourceReference
textBox.SetResourceReference(TextBox.StyleProperty, "MyStyle");
CustomMarkup: Как установить пользовательский MarkupExtension
из кода? Должен ли я позвонить ProvideValue
и в таком случае, как мне получить IServiceProvider
? *
CustomMarkupExtension customExtension = new CustomMarkupExtension();
textBox.Text = customExtension.ProvideValue(??);
Я обнаружил удивительно мало по этому вопросу, так что, это можно сделать?
H.B. ответил на вопрос. Просто добавив некоторые детали здесь, почему я хотел сделать это. Я попытался создать обходной путь для следующей проблемы.
Проблема в том, что вы не можете получить из Binding
и переопределить ProvideValue
, так как он запечатан. Вместо этого вам нужно будет сделать что-то вроде этого: Базовый класс для пользовательских расширений разметки привязки WPF . Но тогда проблема в том, что когда вы возвращаете Binding
в Setter
, вы получаете исключение, но за пределами Style
оно работает нормально.
В нескольких местах я читал, что вы должны возвращать сам MarkupExtension
, если TargetObject
- это Setter
, чтобы позволить ему переоценивать, когда он применяется к фактическому FrameworkElement
, и это имеет смысл.
Однако это работает только тогда, когда TargetProperty
имеет тип object
, в противном случае возвращается исключение. Если вы посмотрите на исходный код BindingBase
, то увидите, что он делает именно это, но, похоже, у фреймворка есть какой-то секретный компонент, который заставляет его работать.