My question is about properly binding the property of one element to another.
Here is the structure of my code:
Data Template contains a grid (let's called the grid
GridA
), and in the grid, I specify an instance of a control, calledControlA
.ControlA
is aUserControl
that contains aGrid
. There is custom logic inControlA
(code-behind) that dynamically builds the content - but in a nutshell, it uses another data template.The data template for
ControlA
consists of anotherGrid
. I want 开发者_开发问答to bind theHeight
property for this grid in this data template to theHeight
property of theGrid
in the data template referenced in my first bullet point above (the grid calledGridA
).
Here is the XAML that I have used for the binding, but, essentially, it isnt working, as its not finding the Grid:
<Grid Height="{Binding Path=ActualHeight,
RelativeSource={RelativeSource FindAncestor,
AncestorType=Grid,
AncestorLevel=2},
UpdateSourceTrigger=PropertyChanged}">
</Grid>
I understand that by specifying AncestorLevel=2
, that it will use the second "found" occurrence of the type that you are looking for, in this case, the type is Grid
. So in my mind, it will first find the Grid
in ControlA
, then it will continue to walk up the tree and find the Grid
in the first data template, which is the Grid
named GridA
. This should be the second occurrence, correct?
Since you're beginning your search from the second grid, you actually want ancestor level = 1 (which is the default). Observe:
<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>
BTW, your design sounds like it fights WPF's layout system rather than embracing it. As such, you're probably creating a lot of unnecessary pain for yourself.
Am I missing something, or could you just use the SharedSizeGroup
property of the RowDefinitions and set Grid.IsSharedSizeGroup="True"
on the outermost control?
精彩评论