找到最近的Ancestor与某些财产

时间:2013-03-09 12:11:38

标签: wpf xaml styles

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的一些巧妙用法,但它看起来不会那么直接。有什么想法吗?

2 个答案:

答案 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"