我正在编写标记扩展名。我有像这样的XAML
<TextBlock Text="{ui:Test SomeInfo}" />
和TestExtension,构造函数接受一个字符串参数。我得到“SomeInfo”字符串所以一切都找到了。现在我想嵌套扩展并编写类似
的内容<TextBlock Text="{ui:Test {Binding PropName}}" />
并且它不能正常工作。我不得不添加一个构造函数,它接受一个System.Windows.Data.Binding类型的参数。
现在我需要知道
Update1 应该针对TextBlock的DataContext解析PropName。
Update2 刚刚找到相关问题:How do I resolve the value of a databinding?
答案 0 :(得分:4)
这样的绑定不起作用,因为你的MarkupExtension
没有DataContext
并且它没有出现在可视树中,我认为你不应该直接与绑定对象进行交互。你真的需要这个扩展吗?也许你可以单独使用绑定和converter?
如果没有, 可以 创建一个具有可绑定属性的专用类(通过继承DependencyObject
),但这仍然不会给你{{ 1 {}或DataContext
所需的名称范围或ElementName
所需的可视化树,因此在这种情况下进行绑定工作的唯一方法是使用RelativeSource
(例如,将其设置为一个Source
)。这并不理想。
另请注意,如果您不直接设置绑定,StaticResource
方法只会被调用一次,这意味着即使您的扩展中有绑定,它也可能不是非常有用(除了一些例外情况,例如,当返回复杂内容时,例如使用绑定的ProvideValue
,但是在ItemsControl
上设置扩展名只是一个字符串),所以我真的怀疑你想要使用像这样的MarkupExtension如果值应根据绑定动态更改。如前所述:请考虑使用converters或MultiBindings代替各种值。