我的问题是将一个元素的属性正确绑定到另一个元素。
这是我的代码的结构:
数据模板包含一个网格(我们称之为网格GridA
),在网格中,我指定了一个名为ControlA
的控件实例。
ControlA
是UserControl
,其中包含Grid
。 ControlA
(代码隐藏)中有自定义逻辑,可以动态构建内容 - 但简而言之,它使用另一个数据模板。
ControlA
的数据模板由另一个Grid
组成。我想将此数据模板中此网格的Height
属性绑定到上面第一个项目符号点中引用的数据模板中Height
的{{1}}属性(名为{{的网格) 1}})。
这是我用于绑定的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
。这应该是第二次出现,对吗?
答案 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"
?