zoukankan      html  css  js  c++  java
  • 七,WPF的元素绑定

    1. 数据绑定是一种关系,该关系告诉WPF从一个源对象提取一些信息,并使用这些信息设置目标对象的属性,目标属性总是依赖项属性,然而,源对象可以是任何内容。
    2. 源对象是WPF元素并且源属性是依赖项属性的数据绑定,这是最简单的数据绑定。
      绑定表达式
      如下XAML示例,数据绑定表达式使用XAML扩展标记,因为绑定表达式以Binding开头,所以它实际上是创建了一个System.Windows.Data.Binding类实例,且设置了它的两个属性:ElementName属性(指示源元素)和Path属性(指示源元素中的属性)。 
      <Window x:Class="WpfApplication1.Test2"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Title="Test2" Height="600" Width="600">
          <Grid>
              <StackPanel>
                  <Slider Name="sliderFontSize" Margin="3" Minimum="1" Maximum="40" Value="10" TickPlacement="TopLeft" />
                  <TextBlock Margin="10" Text="Simple Text" FontSize="{Binding ElementName=sliderFontSize,Path=Value,Mode=OneWay}" HorizontalAlignment="Left" VerticalAlignment="Center" />
              </StackPanel>        
          </Grid>
      </Window>

      也可以使用代码进行数据绑定,以下代码完成和以上代码相同的绑定:

      Binding binding = new Binding();
      binding.Source = sliderFontSize;
      binding.Path = new PropertyPath("Value");
      binding.Mode = BindingMode.TwoWay;
      txtBTest.SetBinding(TextBlock.FontSizeProperty, binding);

      绑定更新
      当使用OneWay或TwoWay绑定时,改变后的值会立即从源传播到目标,而从目标到源,未必会立即发生,它们的行为由Binding.UpdateSourceTrigger属性控制:
      QQ图片20140802202747
      我们可以在代码中使用BindingExpression.UpdateSource()方法来完全控制源对象的更新时机,此时必须选择UpdateSourceTrigger.Explicit模式,为了获取BindingExpression对象,需要调用GetBindingExpression()方法,并传入具有绑定的目标属性,每个元素都从FrameworkElement基类继承了该方法,

    3. 源对象是非元素对象的数据绑定
      当绑定到一个非元素对象时,就需要放弃Binding.ElementName属性,并使用以下属性中的一个:
      Source
      此属性非常简单,唯一的问题是为了进行绑定,需要具有数据对象。我们可以从资源中提取数据对象,可以通过编码生成数据对象,也可以在数据提供程序的帮助下获取数据对象。最简单的选项是将Source属性指向一些已经准备好了的静态对象。例如:

      <TextBlock Margin="5" Text="{Binding Source={x:Static SystemFonts.IconFontFamily}, Path=LineSpacing}"></TextBlock>

      另一种选项是绑定到一个先前作为资源创建的对象,例如下面的标记创建一个指向Calibri字体的FontFamily对象:

      <Window.Resources>
      <FontFamily x:Key="CustomFont">Calibri</FontFamily>
      </Window.Resources>
      <TextBlock Margin="5" Text="{Binding Source={StaticResource CustomFont}, Path=Source}"></TextBlock>

      RelativeSource
      通过此属性可以根据相对于目标对象的关系指向源对象。例如,可以将一个元素绑定到自身或绑定到父元素。为了设置RelativeSource属性,需要使用RelativeSource对象。这会使语法变的更加复杂,因为除了需要创建一个Binding对象外,还需要创建一个嵌套的RelativeSource对象。有两种方法来进行设置,属性设置语法和标记扩展,如下所示:

      <TextBlock Margin="10">
          <TextBlock.Text>
              <Binding Path="Title">
                  <Binding.RelativeSource>
                      <RelativeSource Mode="FindAncestor" AncestorType="{x:Type Window}"/>
                  </Binding.RelativeSource>
              </Binding>
          </TextBlock.Text>
      </TextBlock>
      <TextBlock Text="{Binding Path=Title,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}"></TextBlock>

      QQ图片20140803153658
      DataContext
      如果没有使用Source或RelativeSource属性指向一个源,WPF就从当前元素开始在元素树中向上查找,检查每个元素的DataContext属性,并使用第一个非空的DataContext属性。可以使用和设置Source属性相同的方法设置元素的DataContext属性,也就是说,可以提供内联对象,从一个静态属性中提取,或者从一个资源中提取。示例如下:

      <StackPanel Margin="10" DataContext="{x:Static SystemFonts.IconFontFamily}">
          <TextBlock Margin="5" Text="{Binding Path=Source}"></TextBlock>
          <TextBlock Margin="5" Text="{Binding Path=LineSpacing}"></TextBlock>
          <TextBlock Margin="5" Text="{Binding Path=FamilyTypefaces[0].Style}"></TextBlock>
          <TextBlock Margin="5" Text="{Binding Path=FamilyTypefaces[0].Weight}"></TextBlock>
      </StackPanel>
  • 相关阅读:
    Mac Atom的PHP插件
    WebStorm mac下如何安装WebStorm + 破解
    PHP接收json格式的POST数据
    mysqldump 导出统一限制每张数据表导出的记录数
    centos7下git服务器端搭建
    nginx服务器常见错误代码500、501、502、503、504、505
    【原创】PHPstorm本地修改同步保存到远程服务器
    SVN Checkout 不包括源文件夹根目录
    mac终端显示日历信息命令
    PHP生成唯一RequestID类
  • 原文地址:https://www.cnblogs.com/jiao1855/p/3887346.html
Copyright © 2011-2022 走看看