有时我们不能确定作为Source的对象叫什么名字,但知道它与作为Binding目标的对象在UI布局上有相对关系,比如控件自己关联自己的某个数据、某级容器的数据。这时就可以用RelativeSource。
前端:
<Window x:Class="Demo.RelativeSrcDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="RelativeSrcDemo" Height="300" Width="300">
<Grid x:Name="g1" Background="Red" Margin="10">
<DockPanel x:Name="dl" Background="Orange" Margin="10">
<Grid x:Name="g2" Background="Yellow" Margin="10">
<DockPanel x:Name="d2" Background="LawnGreen" Margin="10">
<TextBox x:Name="textBox1" FontSize="24" Margin="10"/>
</DockPanel>
</Grid>
</DockPanel>
</Grid>
</Window>
后台:
public partial class RelativeSrcDemo : Window
{
public RelativeSrcDemo()
{
InitializeComponent();
RelativeSource rs = new RelativeSource(RelativeSourceMode.FindAncestor);
rs.AncestorLevel = 2;//表示往上找第几个指定类型(如Grid);
rs.AncestorType = typeof(Grid);
Binding binding = new Binding("Name") { RelativeSource = rs };
this.textBox1.SetBinding(TextBox.TextProperty, binding);
}
}
以上方式可以通过一句话在前端实现:
<TextBox x:Name="textBox1" FontSize="24" Margin="10" Text="{Binding RelativeSource={RelativeSource AncestorLevel=2,AncestorType=Grid,Mode=FindAncestor},Path=Name}"/>