我在理解RelativeSource
绑定行为方面遇到了一些问题。
以下是将Label
内容绑定到StackPanel
正确标记的代码:
<Window x:Class="Binding_RelativeSource.MainWindow" Tag="Window Tag">
<Grid Tag="Grid Tag">
<StackPanel Tag="StackPanel Tag" Height="100" HorizontalAlignment="Left" Margin="156,97,0,0" Name="stackPanel1" VerticalAlignment="Top" Width="200">
<Label Content="{Binding Path=Tag,RelativeSource={RelativeSource Mode=FindAncestor,AncestorLevel=1,AncestorType=StackPanel},FallbackValue=BindingFailed}" Height="28" Name="label1" />
</StackPanel>
</Grid>
</Window>
如果我更改了Grid
和AncestorType=Grid
,则上面的代码不会绑定AncestorLevel=2
代码。
我有两个问题:
我想我应该将AncestorLevel更改为2,以绑定到Grid。但它
为AncestorLevel=1
工作。为什么呢?
我也无法将标签绑定到Window标签。请建议。
答案 0 :(得分:21)
AncestorLevel
用于查找要绑定的正确祖先,这是因为可能有多个该类型的祖先。
这是一个显示这个的场景:
<Grid Tag="AncestorLevel 3">
<Grid Tag="AncestorLevel 2">
<Grid Tag="AncestorLevel 1">
<StackPanel Tag="StackPanel Tag" Height="100" HorizontalAlignment="Left" Margin="156,97,0,0" Name="stackPanel1" VerticalAlignment="Top" Width="200">
<Label Content="{Binding Path=Tag,RelativeSource={RelativeSource Mode=FindAncestor,AncestorLevel=1,AncestorType=Grid},FallbackValue=BindingFailed}" Height="28" />
<Label Content="{Binding Path=Tag,RelativeSource={RelativeSource Mode=FindAncestor,AncestorLevel=2,AncestorType=Grid},FallbackValue=BindingFailed}" Height="28" />
<Label Content="{Binding Path=Tag,RelativeSource={RelativeSource Mode=FindAncestor,AncestorLevel=3,AncestorType=Grid},FallbackValue=BindingFailed}" Height="28" />
</StackPanel>
</Grid>
</Grid>
</Grid>
结果:
但您可以使用ElementName
绑定来简化代码,这会使用元素的Name
示例:
<Window x:Class="WpfApplication9.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Name="MyWindow" Tag="This is the window">
<Grid Name="Grid1" Tag="First grid">
<Grid Name="Grid2" Tag="Second grid">
<Grid Name="Grid3" Tag="ThirdGrid">
<StackPanel Name="stackPanel1" Tag="StackPanel Tag" Height="160" HorizontalAlignment="Left" Margin="156,97,0,0" VerticalAlignment="Top" Width="200">
<Label Content="{Binding ElementName=MyWindow, Path=Tag}" Height="28" />
<Label Content="{Binding ElementName=Grid1, Path=Tag}" Height="28" />
<Label Content="{Binding ElementName=Grid2, Path=Tag}" Height="28" />
<Label Content="{Binding ElementName=Grid3, Path=Tag}" Height="28" />
<Label Content="{Binding ElementName=stackPanel1, Path=Tag}" Height="28" />
</StackPanel>
</Grid>
</Grid>
</Grid>
</Window>
结果:
如果您想绑定回Window
,您仍然可以使用FindAncestor
<Window x:Class="WpfApplication9.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Tag="This is the window">
<Grid>
<StackPanel Height="100" HorizontalAlignment="Left" Margin="156,97,0,0" Name="stackPanel1" VerticalAlignment="Top" Width="200">
<Label Content="{Binding Path=Tag,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window},FallbackValue=BindingFailed}" Height="28" />
</StackPanel>
</Grid>
结果:
答案 1 :(得分:1)
我的最终结论:VS2010设计器问题是它没有为Window标签更新RelativeSource绑定。它更新了设计器中其他控件的绑定(我使用Grid&amp; StackPanel检查)但是对于Winodw,它在运行时更新。微软已经在VS2012中为它做了解决方法。