Текущее значение привязки - PullRequest
       22

Текущее значение привязки

0 голосов
/ 26 сентября 2011

Я пишу расширение разметки.У меня есть XAML как этот

<TextBlock Text="{ui:Test SomeInfo}" />

и TestExtension с конструктором, принимающим один строковый аргумент.Я получаю строку "SomeInfo", так что все найти.Теперь я хочу вложить расширения и написать что-то вроде

<TextBlock Text="{ui:Test {Binding PropName}}" />

, и оно не работает как есть.Мне пришлось добавить конструктор, который принимает один аргумент типа System.Windows.Data.Binding.

Теперь мне нужно знать

  1. Как мне извлечь текущее значение из объекта Binding?
  2. Когда мне это делать?Должен ли я каким-либо образом подписаться на изменения или запрашивать это значение каждый раз в методе ProvideValue?

Update1 PropName должно быть разрешено для DataContext TextBlock.

Обновление2 Только что нашел связанный вопрос: Как мне разрешить значение привязки данных?

1 Ответ

4 голосов
/ 27 сентября 2011

Привязки, подобные этой, не будут работать, потому что ваша MarkupExtension не имеет DataContext, и она не отображается в визуальном дереве, и я не думаю, что вы должны взаимодействовать с объектами привязки напрямую. Вам действительно нужно это расширение? Может быть, вы могли бы обойтись только с привязкой и конвертером ?

Если бы вы не могли бы создать выделенный класс, который имеет привязываемые свойства (наследуя от DependencyObject), это, тем не менее, все равно не дало бы вам DataContext или именную область, необходимую для ElementName или для визуального дерева, необходимого для RelativeSource, поэтому единственный способ заставить привязку работать в этой ситуации - использовать Source (например, установить его на StaticResource). Это вряд ли идеально.

Также обратите внимание, что если вы не устанавливаете привязку напрямую, метод ProvideValue будет вызываться только один раз, это означает, что даже если у вас есть привязка в вашем расширении, она может оказаться не очень полезной (за некоторыми исключениями, например, когда возвращает сложное содержимое, например, ItemsControl, который использует привязку, но вы устанавливаете расширение на TextBlock.Text, который является просто строкой), поэтому я действительно сомневаюсь, что вы хотите использовать MarkupExtension, как это, если значение должно динамически меняться на основании привязки. Как отмечалось ранее: рассмотрите конвертеры или MultiBindings для различных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...