0

有没有办法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指定 a Tag,那么GroupBox它应该从GroupBox. 我在想一些巧妙的用法AncestorLevel,但看起来它不会那么直截了当。有任何想法吗?

4

2 回答 2

0

我认为属性值继承是您所需要的。根据文章,

要使属性参与值继承,请创建自定义附加属性,如如何:注册附加属性中所述。使用元数据 ( FrameworkPropertyMetadata )注册属性,并在该元数据的选项设置中指定“继承”选项。还要确保该属性具有已建立的默认值,因为该值现在将继承。

如果您想要更特别的东西,您可以编写自己的标记扩展,它将使用VisualTreeHelper类遍历 WPF 可视树并查找您需要的元素。

于 2013-03-09T12:34:13.153 回答
0

您可以只检查第一个FrameworkElement,因为FrameworkElement是包含该Tag属性的类。

RelativeSource="{RelativeSource AncestorType=FrameworkElement}" Path="Tag"
于 2013-03-09T21:06:04.577 回答