zoukankan      html  css  js  c++  java
  • 星空雅梦

    WPF教程(四)RelativeSource属性

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

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

    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三种使用方法,目前就碰到三种,有新的会继续更。知识是没有边界的,不断地探知即为知识来源,取之不竭、用之不尽。刚刚新开项目,安排了不少任务,有时间再写。

  • 相关阅读:
    利用Expression实现DbReader到对象属性的绑定
    致多年后第一次更新
    阿拉伯数字转换成中文大写
    Android程序的入口点是什么,不是Main()吗
    imageButton 和button的区别
    对象和引用的区别
    hdu 4455 Substrings
    Running Rabbits
    ZOJ Problem Set
    几乎就是并查集 (Almost Union-Find,UVa 11987)
  • 原文地址:https://www.cnblogs.com/LiZhongZhongY/p/10870405.html
Copyright © 2011-2022 走看看