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