WPF教程(四)RelativeSource属性

2018年08月13日 15:11:56 yangwenxue1989 阅读数:749  

我们进行Bingding时,如果明确知道数据源的Name,就能用Source或者ElementName进行绑定,但是有时候我们需要绑定的数据源可能没有明确的Name,此时我们就需要利用Bingding的RelativeSource进行绑定,这种办法的意思是指当前元素和绑定源的位置关系。

(1)控件关联自身的属性——Self

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  1.   <Window x:Class= "RelativeSource.MainWindow"
  2.   xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.   xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
  4.   Title= "MainWindow" Height="350" Width="525">
  5.   <Grid>
  6.   <StackPanel>
  7.   <TextBox Height= "30" Width="60" Name="Box1" Text="{Binding RelativeSource={RelativeSource Mode=self},Path=Name }"/>
  8.   </StackPanel>
  9.   </Grid>
  10.   </Window>

上例是前台xaml写法,再看下后台怎么实现:

  1.   public MainWindow()
  2.   {
  3.   InitializeComponent();
  4.   System.Windows.Data.RelativeSource rs = new System.Windows.Data.RelativeSource();
  5.   rs.Mode = RelativeSourceMode.Self;
  6.   Binding binding = new Binding("Name") { RelativeSource = rs };
  7.   this.Box1.SetBinding(TextBox.TextProperty, binding);
  8.   }

(2)控件关联其父级容器的属性——AncestorType

  1.   <Window x:Class= "RelativeSource.MainWindow"
  2.   xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.   xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
  4.   Title= "MainWindow" Height="350" Width="525">
  5.   <Grid Name= "G1">
  6.   <Grid Name= "G2">
  7.   <StackPanel Name= "S1">
  8.   <TextBox Height= "30" Width="60" Name="Box1" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}, AncestorLevel=2},Path=Name }"/>
  9.   </StackPanel>
  10.   </Grid>
  11.   </Grid>
  12.   </Window>

详细介绍下AncestorLevel,它指的是以Bingding目标控件为起点的层级偏移量,S1的偏移量是1,G2的偏移量是2,G1是偏移量3,AncestorType指的是要找的目标对象的类型。值得注意的是AncestorLevel必须参考AncestorType使用,如上面设置了AncestorType={x:Type Grid},则Bingding在寻找时会忽略非Grid的控件,此时G2的偏移量是1,G1的偏移量是2,StackPanel被忽略。

(3)控件关联模板的属性——TemplatedParent

  1.   <Window.Resources>
  2.   <Style TargetType= "{x:Type Button}">
  3.   <Setter Property= "Background" Value="Green"/>
  4.   <Setter Property= "Template">
  5.   <Setter.Value>
  6.   <ControlTemplate TargetType= "{x:Type Button}">
  7.   <Grid>
  8.   <Ellipse>
  9.   <Ellipse.Fill>
  10.   <SolidColorBrush Color= "{Binding Path=Background.Color,RelativeSource={RelativeSource TemplatedParent}}"/>
  11.   </Ellipse.Fill>
  12.   </Ellipse>
  13.   </Grid>
  14.   </ControlTemplate>
  15.   </Setter.Value>
  16.   </Setter>
  17.   </Style>
  18.   </Window.Resources>

总结

从运用性上介绍了RelativeSource三种使用方法,目前就碰到三种,有新的会继续更。知识是没有边界的,不断地探知即为知识来源,取之不竭、用之不尽。刚刚新开项目,安排了不少任务,有时间再写。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄