是否有一种方法可以将Style
中的属性设置器值绑定到为该属性提供值的最近的父节点?例如,如果我有以下层次结构:
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
,但它看起来不会那么直接。什么好主意吗?
我认为属性值继承是你需要的。根据文章,
若要使属性参与值继承,请创建自定义附加属性,如如何:注册附加属性中所述。用元数据(FrameworkPropertyMetadata)注册属性,并在该元数据的选项设置中指定"Inherits"选项。还要确保该属性具有已建立的默认值,因为该值现在将被继承。
如果你想要更特别的东西,你可以编写你自己的标记扩展,它将使用VisualTreeHelper类遍历WPF可视化树并查找你需要的元素。
您可以检查第一个FrameworkElement
,因为FrameworkElement
是包含Tag
属性的类。
RelativeSource="{RelativeSource AncestorType=FrameworkElement}" Path="Tag"