Как установить пользовательское расширение MarkupExtension из кода

Как установить пользовательский MarkupExtension из кода?

Можно легко установить, если из Xaml. То же самое можно сделать для Binding и DynamicResource.


Установка одинаковых значений через код позади требует немного другого подхода

  1. Связывание: Используйте textBox.SetBinding или BindingOperations.SetBinding

    Связывание = новая привязка("Размер шрифта");
    BindingOperations.SetBinding(textBox, TextBox.FontSizeProperty, привязка);
    
  2. DynamicResource: Use SetResourceReference

    textBox.SetResourceReference(TextBox.StyleProperty, "MyStyle");
    
  3. CustomMarkup: Как установить пользовательскую MarkupExtension из кода? Надо ли вызывать ProvideValue и в этом случае, как получить доступ к IServiceProvider?*

    CustomMarkupExtension customExtension = new CustomMarkupExtension();
    textBox.Text = customExtension.ProvideValue(??);
    

Я на удивление мало что нашел на эту тему, так можно ли это сделать?


H.B. ответил на вопрос. Просто добавляю некоторые детали, чтобы понять, почему я хотел это сделать. Я попытался создать обходной путь для следующей проблемы.

Проблема в том, что вы не можете извлечь из связывания и переопределить ProvideValue , так как он запечатан. Вместо этого вам придется сделать что-то подобное: базовый класс для пользовательского расширения разметки привязки WPF. Но проблема в том, что когда вы возвращаете Привязку к Установке , вы получаете исключение, но за пределами Стиля это работает нормально.

Я читал в нескольких местах, что вы должны вернуть самому MarkupExtension, если TargetObject является Setter, чтобы он мог рециркулировать после его применения к действительному FrameworkElement, и это имеет смысл.

Однако, это работает только тогда, когда TargetProperty имеет тип объекта, в противном случае исключение возвращается. Если вы посмотрите на исходный код BindingBase, то увидите, что он делает именно это, но кажется, что во фреймворке есть какой-то секретный ингредиент, который заставляет его работать.

7
задан Community 23 May 2017 в 11:44
поделиться