使用FindAncestor和AncestorLevel将网格高度绑定到另一个网格

Chr*_*ris 6 wpf binding

我的问题是将一个元素的属性正确绑定到另一个元素.

这是我的代码的结构:

  1. 数据模板包含一个网格(我们称之为网格GridA),在网格中,我指定一个名为的控件实例ControlA.

  2. ControlA是一个UserControl包含Grid.ControlA(代码隐藏)中有自定义逻辑,可以动态构建内容 - 但简而言之,它使用另一个数据模板.

  3. 数据模板ControlA由另一个组成Grid.我想Height将此数据模板中此网格的属性绑定到上面第一个项目符号中引用的数据模板中的Height属性Grid(称为网格GridA).

这是我用于绑定的XAML,但实质上它不起作用,因为它找不到Grid:

<Grid Height="{Binding Path=ActualHeight,
                       RelativeSource={RelativeSource FindAncestor,
                                       AncestorType=Grid,
                                       AncestorLevel=2},
                       UpdateSourceTrigger=PropertyChanged}">
</Grid>
Run Code Online (Sandbox Code Playgroud)

我理解通过指定AncestorLevel=2它将使用您正在寻找的类型的第二个"找到"事件,在这种情况下,类型是Grid.所以在我看来,它会首先找到Gridin ControlA,然后它将继续向上走树并找到Grid第一个数据模板,即Grid命名GridA.这应该是第二次出现,对吗?

Ken*_*art 6

由于您是从第二个网格开始搜索,因此您实际上需要祖先级别= 1(这是默认值).注意:

<Grid x:Name="first">
    <Grid x:Name="second">
        <Grid x:Name="third" Tag="{Binding Name, RelativeSource={RelativeSource FindAncestor, AncestorType=Grid, AncestorLevel=2}}">
            <!-- displays "first", not "second" -->
            <TextBlock Text="{Binding Tag, ElementName=third}"/>
        </Grid>
    </Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你的设计听起来像是在与WPF的布局系统作斗争而不是拥抱它.因此,你可能会给自己造成很多不必要的痛苦.