0

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

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

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

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

它不能按原样工作。我必须添加一个构造函数,它接受一个 System.Windows.Data.Binding 类型的参数。

现在我需要知道

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

Update1 PropName 应针对 TextBlock 的 DataContext 进行解析。

Update2刚刚发现相关问题:如何解析数据绑定的值?

4

1 回答 1

4

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

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

另请注意,如果您不直接设置绑定,则该ProvideValue方法只会被调用一次,这意味着即使您的扩展中有绑定,它也可能不是很有用(除了一些例外,例如在返回复杂内容时,例如一个ItemsControl使用绑定,但您设置的扩展名TextBlock.Text只是一个字符串),所以我真的怀疑如果值应该根据绑定动态更改,您是否要使用这样的 MarkupExtension。如前所述:请考虑使用转换器MultiBindings来代替各种值。

于 2011-09-26T20:09:45.563 回答