我正在编写标记扩展。我有这样的XAML
<TextBlock Text="{ui:Test SomeInfo}" />
和TestExtension,构造函数接受一个字符串参数。我得到了"SomeInfo"字符串所以一切都是find。现在我想嵌套扩展,写一些像
这样的东西<TextBlock Text="{ui:Test {Binding PropName}}" />
不能正常工作。我必须添加一个构造函数,它接受System.Windows.Data.Binding类型的一个参数。
现在我需要知道
- 我应该如何从绑定对象中检索当前值?
- 我应该什么时候做这个?我应该订阅的变化以某种方式或要求的值,每次在ProvideValue方法?
Update1 PropName应该根据TextBlock的DataContext进行解析。
Update2刚刚发现相关问题:我如何解决数据绑定的值?
这样的绑定将不起作用,因为你的MarkupExtension
没有DataContext
,它没有出现在可视化树中,我认为你不应该直接与绑定对象交互。你真的需要这个扩展吗?也许你可以只使用绑定和转换器?
如果不是可以创建一个具有可绑定属性的专用类(通过继承DependencyObject
),但是这仍然不会给您ElementName
所需的DataContext
或名称范围或RelativeSource
所需的可视树,因此在这种情况下使绑定工作的唯一方法是使用Source
(例如将其设置为StaticResource
)。这是不理想的。
还要注意,如果你不直接设置一个绑定ProvideValue
方法只调用一次,这意味着,即使你有一个绑定在你的扩展,它可能不能证明非常有用的(除了一些例外,例如当返回复杂的内容,就像如ItemsControl
使用绑定,但是您设置扩展TextBlock.Text
就是一个字符串),我真的怀疑,你想用这样的MarkupExtension如果该值应根据绑定动态变化。如前所述:考虑为各种值使用转换器或MultiBindings。