Binding的源和路径

  • Binding的源

  Binding的源也就是数据的源头。Binding对源的要求并不苛刻---只要它是一个对象,并且通过属性(Property)公开自己的数据,它就能作为Binding的源。

  实体类作为Binding的源,需要实现INotifyPropertyChanged接口并在属性set中触发PropertyChanged事件。详细内容可见http://www.cnblogs.com/yijiaoyingbi/p/4841038.html

  为了让UI元素产生一些联动效果,可以使用Binding在控件间建立关联。如下代码所示,把一个TextBox的Text属性关联在了Slider的Value属性上。  

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="150" Width="225">
    <StackPanel Margin="0,0,0,-1">
        <TextBox x:Name="textBox1" Text="{Binding Path=Value,ElementName=slider1}" BorderBrush="Black" Margin="5"></TextBox>
        <Slider x:Name="slider1" Maximum="100" Minimum="0" Margin="5"></Slider>
    </StackPanel>
</Window>

   Text="{Binding Path=Value,ElementName=slider1}" 使用了Binding的标记扩展语法,与之等价的C#代码是:

  this.textBox1.SetBinding(TextBox.TextProperty, new Binding("Value") { ElementName = "slider1" });

  • Binding数据更新

  运行上面的例子,可以发现,拖动Slider之后,TextBox的Text会发生变化,当手动在TextBox输入一个数值然后按下Tab使TextBox失去焦点后,Slider的值也会发生变化,这就涉及到了Binding的两个属性Mode和UpdateSourceTrigger。

  Binding在源与目标之间架起了沟通的桥梁,默认情况下数据既能够通过Binding送达目标,也能够从目标返回源(收集用户对数据的修改)。有的时候数据只是需要展示给用户、不允许用户修改,这就可以把Binding模式修改为源向目标的单向沟通。控制Binding数据流向的属性就是Mode,它的类型是BindingMode枚举。

  为什么TextBox失去焦点后Slider的Value才会发生改变呢?这涉及到了Binding的另一个属性---UpdateSourceTrigger,它的类型是UpdateSourceTrigger枚举,可取值为PropertyChanged、LostFocus、Explicit和Default。

  • Binding的路径

  Bindig的路径指明Binding关注的是源的哪个属性。尽管在XAML代码中或者Binding的构造函数的参数列表中我们以一个字符串表示Path,但Path的实际类型是PropertyPath。以上面例子中指定Path的代码为例Path=Value,与之等效的C#代码是:

Binding binding = new Binding() { Path = new PropertyPath("Value"), Source = this.slider1 };
 this.textBox1.SetBinding(TextBox.TextProperty, binding);

  Binding还支持多级路径,通俗讲就是一路“点”下去。比如我们想让一个TextBox显示另一个TextBox的文本长度,我们可以这样写:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="150" Width="225" Loaded="Window_Loaded">
    <StackPanel Margin="0,0,0,-1">
        <TextBox x:Name="textBox1" Text=""  BorderBrush="Black" Margin="5"></TextBox>
        <TextBox x:Name="textBox2" Text="{Binding Path=Text.Length,ElementName=textBox1,Mode=OneWay}"  BorderBrush="Black" Margin="5"/>
    </StackPanel>
</Window>

  我们知道,集合类型的索引器(Index)又被称为带参属性。既然是属性,索引器也能作为Path来使用。比如我们想让一个TextBox显示另一个TextBox问的第四个字符就可以这样写:

<TextBox x:Name="textBox2" Text="{Binding Path=Text[3],ElementName=textBox1,Mode=OneWay}"  BorderBrush="Black" Margin="5"/>

  当使用一个集合或DataView作为Binding的源时,如果我们想把它的默认元素当作Path使用,则需要使用这样的语法:

 List<string> stringList = new List<string>() { "Hello", "World", "WPF" };
            this.textBox1.SetBinding(TextBox.TextProperty, new Binding("/") { Source = stringList });
            this.textBox2.SetBinding(TextBox.TextProperty, new Binding("/Length") { Source = stringList,Mode=BindingMode.OneWay });
            this.textBox3.SetBinding(TextBox.TextProperty, new Binding("/[1]") { Source = stringList,Mode=BindingMode.OneWay });

  如果集合元素的属性仍然是一个集合,我们想把子级集合中的元素当作Path,则可以使用多级斜线的语法。

  有的时候,我们会在代码中看到一些Path是一个“.”或者干脆没有Path的Binding,其实这是一种比较特殊的情况,即Binding的源本身就是数据且不需要Path来指明。典型的String、int等基本数据类型,它们本身就是数据,我们无法指出通过它的哪个属性来访问这个数据。在XAML里这个“.”可以省略,但在C#代码里不能省略。

时间: 2024-10-01 06:01:39

Binding的源和路径的相关文章

Binding的Path(路径)

Binding的源可以是控件(一个控件是另一个控件的Source.控件把自己的容器作为Source),把集合作为ItemsControls的Source,把xml作为Tree或者Menu的Source,或者是不给它Source,让他自己去找. 一个控件为另一个控件的Source <TextBox x:Name="textBox" Text="{Binding Value,ElementName=slider1}" BorderBrush="Black

WPF学习之Binding(一)

Binding WPF的核心理念是传统的变UI驱动程序为数据驱动UI,支撑这个理念的基础就是Data Binding和与之相关的数据校验和转换. 使用Binding时,最重要的是准确设置它的源和路径. Binding基础 Binding是数据的桥梁,两端分别是Source(源)和Target(目标) 例子:创建一个简单的数据源binding在UI元素上 创建数据源(student类) class Student : INotifyPropertyChanged { public event Pr

【转载一篇WPF之Binding】WPF之Binding深入探讨

1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的程序来说,算法一般分布在这几处: A.数据库内部. B.读取和写回数据. C.业务逻辑. D.数据展示. E.界面与逻辑的交互. A,B两部分的算法一般都非常稳定,不会轻易去改动,复用性也很高:C处与客户需求最紧密,最复杂,变化最大,大多少算法都集中在这里.D,E负责UI和逻辑的交互,也占有一定量的

WPF学习之Binding的学习(一)

程序的本质是数据加算法.通俗一点来说呢,其实就是用户给一个输入,经过算法的处理之后,计算机反馈一个输出给用户.可以很清楚的看出,在这个过程中,处于主导地位的是数据.但是,当我们在进行图形用户界面(Graphic User Interface,GUI)编程的时,数据总是处于被动地位.也就是说,程序总是在等待接收来自UI的消息/事件,在这些事件被处理之后,才会反馈给用户一个输出.我们用Data Binding可以在GUI编程时让数据回到程序的核心. **1.Data Binding在WPF中的地位*

WPF之Binding深入探讨

1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都非常重要.但算法在3层中的分布是不均匀的,对于一个3层结构的程序来说,算法一般分布在这几处: A.数据库内部. B.读取和写回数据. C.业务逻辑. D.数据展示. E.界面与逻辑的交互. A,B两部分的算法一般都非常稳定,不会轻易去修改,复用性也非常高:C处与客户需求最紧密,最复杂,变化最大,大多少算法都集中在这里.D,E负责UI和逻辑的交互,也占有一定

WPF Data Binding之数据的转换和校验【四】

Binding的作用就是架在Source和Target之间的桥梁,数据可以在这座桥梁的帮助下来流通.就像现实社会中桥梁需要设置安检和关卡一样,Binding这座桥上也可以设置关卡对数据进行验证,不仅如此,如果Binding两端需要不同的数据类型的时候我们还可以为数据设置转换器. Binding用于数据有效性校验的关卡是他的ValidationRules属性,用于数据类型转换的关卡是它的Convert属性. 1.1 Binding的数据校验 Binding的ValidationRules属性是Co

WPF Data Binding之地位与基础【一】

[1]Data Binding在WPF中的地位 从传统的Winform转移到WPF上,对于一个三层程序而言,数据存储层由数据库和文件系统组成,数据传输和处理仍然使用.NetFramework的ADO.NET等基本类(与Winform开发一样).展示层则使用WPF类库来实现,而展示层和逻辑层的沟通就使用Data Binding来实现.可见,Data Binding在WPF中所起的作用就是高速公路的作用.有了这条高速公路,加工好的数据自动送达用户界面并加以显示,被用户修改过的数据也会自动传回业务逻辑

WPF之Binding【转】

WPF之Binding[转] 看到WPF如此之炫,也想用用,可是一点也不会呀. 从需求谈起吧: 首先可能要做一个很炫的界面.见MaterialDesignInXAMLToolKit. 那,最主要的呢,还是想显示数据. 就先来数据,数据可以从数据库里得到,可是如何显示出来呢? 本文的主角出来了:(以下内容全转载他人,具体 原文见上面的链接) ==================================== 1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.

Binding笔记

Binding基础  绑定某个对象的属性值到控制上,写法如下: public class Order : INotifyPropertyChanged//只要实现此接口 { public event PropertyChangedEventHandler PropertyChanged; private string orderNo; public string OrderNo { get { return orderNo; } set { orderNo = value; if (Proper