Привязки, подобные этой, не будут работать, потому что ваша MarkupExtension
не имеет DataContext
, и она не отображается в визуальном дереве, и я не думаю, что вы должны взаимодействовать с объектами привязки напрямую. Вам действительно нужно это расширение? Может быть, вы могли бы обойтись только с привязкой и конвертером ?
Если бы вы не могли бы создать выделенный класс, который имеет привязываемые свойства (наследуя от DependencyObject
), это, тем не менее, все равно не дало бы вам DataContext
или именную область, необходимую для ElementName
или для визуального дерева, необходимого для RelativeSource
, поэтому единственный способ заставить привязку работать в этой ситуации - использовать Source
(например, установить его на StaticResource
). Это вряд ли идеально.
Также обратите внимание, что если вы не устанавливаете привязку напрямую, метод ProvideValue
будет вызываться только один раз, это означает, что даже если у вас есть привязка в вашем расширении, она может оказаться не очень полезной (за некоторыми исключениями, например, когда возвращает сложное содержимое, например, ItemsControl
, который использует привязку, но вы устанавливаете расширение на TextBlock.Text
, который является просто строкой), поэтому я действительно сомневаюсь, что вы хотите использовать MarkupExtension, как это, если значение должно динамически меняться на основании привязки. Как отмечалось ранее: рассмотрите конвертеры или MultiBindings для различных значений.