在Style
中是否有办法将属性setter值绑定到为该属性提供值的最近父级?例如,如果我有以下层次结构:
Window
> Grid
> GroupBox
> Grid
> TextBox
我写了以下Style
:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Visibility" >
<Setter.Value>
<Binding Converter="{StaticResource TagToVisibilityConverter}"
RelativeSource="{RelativeSource AncestorType=Window}" Path="Tag" />
</Binding>
</Setter.Value>
</Setter>
</Style>
这将只是转到顶级父级(Window
)并获取Tag属性。我想要的是搜索最近使用Tag
属性的父级,例如,在上面的层次结构中,如果UserControl
指定Tag
,那么GroupBox
也是如此},它应该从GroupBox
获取值。我在考虑使用AncestorLevel
的一些巧妙用法,但它看起来不会那么直接。有什么想法吗?
答案 0 :(得分:0)
我认为Property Value Inheritance就是你所需要的。根据文章,
要使属性参与值继承,请创建自定义附加属性,如How to: Register an Attached Property中所述。使用元数据(FrameworkPropertyMetadata)注册该属性,并在该元数据的选项设置中指定“继承”选项。还要确保该属性具有已建立的默认值,因为该值现在将继承。
如果你想要更特别的东西,你可以编写自己的markup extention,它将使用VisualTreeHelper类来浏览WPF Visual Tree并查找你需要的元素。
答案 1 :(得分:0)
您可以检查第一个FrameworkElement
,因为FrameworkElement
是包含Tag
属性的类。
RelativeSource="{RelativeSource AncestorType=FrameworkElement}" Path="Tag"