前言
RelativeSource用于在绑定时相对于当前元素来定位绑定源,而不是使用 ElementName 或 DataContext,它主要有两种相对于当前元素来确定绑定源的方式,一种是将自己作为绑定源;另一种是指定绑定的控件类型,系统自动寻找自身的父控件,父控件的父控件,以此类推一层层往上寻找。
1、self

下面的代码中Button的Width属性采用绑定的方式,并且指定Path为Height属性,然后使用RelativeSource={RelativeSource self}来指定绑定的源就是自己,所以你能看到最后Button的宽度和高度是一样大。
csharp
<Window x:Class="wpf之RelativeSource.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf之RelativeSource"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid Background="Blue" >
<Grid.RowDefinitions >
<RowDefinition Height="300"/>
<RowDefinition Height=" 1*"/>
</Grid.RowDefinitions >
<Grid Grid.Row="0" Background="Red" >
<StackPanel Orientation="Vertical" >
<Button Height=" 100" Content=" 1" Width="{Binding Path=Height, RelativeSource={RelativeSource self}}"/>
</StackPanel >
</Grid>
</Grid >
</Window>
2、AncestorType

下面的代码中Button的Foreground 字体颜色属性采用绑定的方式,并且指定Path为Background 属性,然后第一个Button使用RelativeSource={RelativeSource AncestorType=Grid }来指定绑定的源的类型是Grid,这样系统就能自动寻找Button的父控件中第一个Grid的Background,最后也是为红色;第二个Button使用RelativeSource={RelativeSource AncestorType=Grid, AncestorLevel=2 }来指定绑定的源的类型是Grid,并且通过AncestorLevel=2来指定找到的第2个Grid才是最终要找的Grid,最后找到的Grid也就是最外层的Grid背景也就是蓝色,所以第2个Button的字体颜色就是蓝色。
csharp
<Window x:Class="wpf之RelativeSource.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf之RelativeSource"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid Background="Blue" >
<Grid.RowDefinitions >
<RowDefinition Height="300"/>
<RowDefinition Height=" 1*"/>
</Grid.RowDefinitions >
<Grid Grid.Row="0" Background="Red" >
<StackPanel Orientation="Vertical" >
<Button Height="20" Content=" 2" Foreground ="{Binding Path=Background , RelativeSource={RelativeSource AncestorType=Grid }}"/>
<Button Height=" 20" Content=" 2" Foreground ="{Binding Path=Background , RelativeSource={RelativeSource AncestorType=Grid, AncestorLevel=2 }}"/>
</StackPanel >
</Grid>
</Grid >
</Window>