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

时间:2010-09-06 13:32:06

标签: wpf binding

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

这是我的代码的结构:

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

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

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

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

    Grid

    我理解通过指定GridA,它将使用您要查找的类型的第二个“找到”事件,在这种情况下,类型为<Grid Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource FindAncestor, AncestorType=Grid, AncestorLevel=2}, UpdateSourceTrigger=PropertyChanged}"> </Grid> 。所以在我看来,它首先会在AncestorLevel=2中找到Grid,然后它将继续向上走树,并在第一个数据模板中找到Grid,即ControlA 1}}名为Grid。这应该是第二次出现,对吗?

2 个答案:

答案 0 :(得分: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>
顺便说一下,你的设计听起来像是在与WPF的布局系统作斗争而不是拥抱它。因此,你可能会为自己造成许多不必要的痛苦。

答案 1 :(得分:0)

我是否遗漏了某些内容,或者您​​是否可以使用RowDefinitions的SharedSizeGroup属性并在最外层的控件上设置Grid.IsSharedSizeGroup="True"