当前绑定值

时间:2011-09-26 19:27:09

标签: wpf binding markup-extensions

我正在编写标记扩展名。我有像这样的XAML

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

和TestExtension,构造函数接受一个字符串参数。我得到“SomeInfo”字符串所以一切都找到了。现在我想嵌套扩展并编写类似

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

并且它不能正常工作。我不得不添加一个构造函数,它接受一个System.Windows.Data.Binding类型的参数。

现在我需要知道

  1. 如何从Binding对象中检索当前值?
  2. 我应该什么时候这样做?我应该以某种方式订阅更改,还是每次在ProvideValue方法中询问该值?

  3. Update1 应该针对TextBlock的DataContext解析PropName。

    Update2 刚刚找到相关问题:How do I resolve the value of a databinding?

1 个答案:

答案 0 :(得分:4)

这样的绑定不起作用,因为你的MarkupExtension没有DataContext并且它没有出现在可视树中,我认为你不应该直接与绑定对象进行交互。你真的需要这个扩展吗?也许你可以单独使用绑定和converter

如果没有, 可以 创建一个具有可绑定属性的专用类(通过继承DependencyObject),但这仍然不会给你{{ 1 {}或DataContext所需的名称范围或ElementName所需的可视化树,因此在这种情况下进行绑定工作的唯一方法是使用RelativeSource(例如,将其设置为一个Source)。这并不理想。

另请注意,如果您不直接设置绑定,StaticResource方法只会被调用一次,这意味着即使您的扩展中有绑定,它也可能不是非常有用(除了一些例外情况,例如,当返回复杂内容时,例如使用绑定的ProvideValue,但是在ItemsControl上设置扩展名只是一个字符串),所以我真的怀疑你想要使用像这样的MarkupExtension如果值应根据绑定动态更改。如前所述:请考虑使用convertersMultiBindings代替各种值。