Binding,音译为绑定,通道捆她想一条数据的高速绑着“源”与“目标”;

“源”乃提供数据的一方;“目标”乃接收数据并作出相应反应的一方;

过程感觉就像是,给一个“激励”,就会作出“反应”那样~~~

首先引入一个小例子,希望移动游标时,文本框中显示游标相应的刻度:

那么,我们可以把游标看作是“源”,文本显示框看作是“目标”!

<TextBox x:Name="txt"/>

<Slider x:Name="slider"/>

这样“源”和“目标”就都有了!

把“源”和“目标”绑定起来的过程,我放到后台去实现,感觉这样理解binding会更清晰!

//实例化一个Binding

Binding binding = new Binding();

//binding指定源,以及需要绑定的源的属性

binding.Source = slider;//源

binding.Path = new PropertyPath("Value");//源的属性

//指定目标,目标的属性,并关联Binding

txt.SetBinding(TextBox.TextProperty, binding);//或者写成:BindingOperations.SetBinding(txt, TextBox.TextProperty, binding);

效果如下:

总结:

1、Binding的几个步骤:

1、新建Binding;

2、指定Binding的源,以及源的属性;

3、指定Binding的目标,以及目标的属性;

2、txt.SetBinding(TextBox.TextProperty, binding);等价写法:

BindingOperations.SetBinding(txt, TextBox.TextProperty, binding);

3、后台三合一写法:

txt.SetBinding(TextBox.TextProperty, new Binding("Value") { Source = slider});

4、等价后台的前台写法:

<TextBox x:Name="txt" Text="{Binding Path=Value, ElementName=slider}"/>

<Slider x:Name="slider"/>

对比后台写法,我们发现当指定源时,用的是ElementName属性,而不是Source;事实上前台指定Source=slider

这样是不成功的。

后台txt.SetBinding(TextBox.TextProperty, new Binding("Value") { ElementName = “slider”});

没有问题。

摘至:《WPF深入浅出》

5、前台XAML往往为我们设置好了转换器,而后台C#是没有为我们准备转换的,需要自己去转换。

1、如前台中直接Path=Value,而后台中是:binding.Path = new PropertyPath("Value");

2、如前台中直接Text=,而后台中是:TextBox.TextProperty

//----------------------------------前面的只是铺垫,接下来才是主菜-------------------------

如果说,我自己定义一个类,在类里自定义一个属性,让后让某个WPF某个元素的属性,与自定义的属性绑定在一起这个怎么实现呢?

我们知道WPF里的每个元素都包含一个DataContext元素,当Bingding只知道自己的Path,而不知道自己的Souce时;换句话说,当

Bingding只知道绑定源的属性,却不知道是哪个源的时候;他就会自己去看父级元素的DataContext属性中,是否有它绑定的Path。

如果没有就看爷爷的DataContext中有没有,一直向上找。接下来我就看一个例子:

首先新建一个自己的类People,我们希望自定义的属性被绑定。

 class People
{
private string name = "我是谁?"; public string Name
{
get { return name; }
set { name = value; }
} private string sex = "人妖"; public string Sex
{
get { return sex; }
set { sex = value; }
} public void Call()
{
name = "Hi,我是宋桓公";
sex = "男";
MessageBox.Show(name+"--"+sex);
}
}

接着是XAML:

 <Window x:Class="test1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:test1"
Title="MainWindow" Height="350" Width="525">
<StackPanel x:Name="st">
<StackPanel.DataContext>
<local:People/>
</StackPanel.DataContext>
<TextBox x:Name="txtName" Text="{Binding Path=Name}"/>
<TextBox x:Name="txtSex" Text="{Binding Path=Sex}"/>
<Button x:Name="btn" Click="btn_Click_1"/>
</StackPanel>
</Window>

这段,就是在StackPanel的DataContext属性中包含一个People实例。注意这里的语法,local是我们为映射

的命名空间,自己取的名字,而local后面只能加一个类名,而不是实例名。<local:People/>而这句话的意思是

创建一个People实例~!

3、<TextBox x:Name="txtName" Text="{Binding Path=Name}"/>

<TextBox x:Name="txtSex" Text="{Binding Path=Sex}"/>

接着,我们分别为两个TextBox的Text属性绑定名为Name和Sex的属性,但是不指定Souce是谁。于是乎,他们

知道Path,而不知道Souce,就会去看自己的“父亲”——StackPanel的DataContext中有啥?发现了People,

而People正好具备了Name和Sex的属性,那么Text会显示什么呢?

看来绑定成功了,我们属性的初始化值正是这两个!但是仅仅是这样,并不能满足我,我想动态的去改变这个绑定的值

才是我最终的目的!于是在后台,我这么写:

private void btn_Click_1(object sender, RoutedEventArgs e)

{

People people = new People();

people.Call();

}

我希望通过调用Call方法,来改变people的属性Name和Sex的值。但是点击按钮后,值却没有发生改变!

原因很简单,这是因为<local:People/>创建的实例,和btn_Click_1中创建的PeoPle实例,完全是两个实例!自然

不会变。于是,我想如果这这样<local:People x:Name ="pp" />为local创建的实例取个名字,让后去按键中修改属性值,看

Text的值是否发生变化。

private void btn_Click_1(object sender, RoutedEventArgs e)

{

pp.Call();

}

但,遗憾的是,这样仍然没有效果~

不要放弃,我们继续改,之后我们再一次绑定,同样不指明Souce:

private void btn_Click_1(object sender, RoutedEventArgs e)

{

pp.Call();

txtName.SetBinding(TextBox.TextProperty, new Binding("Name") { });

txtSex.SetBinding(TextBox.TextProperty, new Binding("Sex") { });

}

后台再一次绑定之后发现,成功了!但是还是不能让人满意,因为每次改变属性,

都要从新绑定一次!

//-----------这里还有一个有趣的事情想插播一下-----------------

如果,我指名Souce为st,会得到什么结果呢?

txtName.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = st});

txtSex.SetBinding(TextBox.TextProperty, new Binding("Sex") { Source = st});

结果是:

姓名显示,st,性别没显示~~

如果,我指名Souce为st.DataContext,会得到什么结果呢?

结果又正常了~~~

这个是为什么呢?我分析原因是这个样子的:

当为Binding指定Path而不指定Souce时,他会去看父级元素的DataContext属性中,是否有它绑定的Path。

反之,如果指定Path且指定Souce时,他就只会看父亲元素,而不会去看父级元素的DataContext属性中,是否有它绑定的Path。所以,姓名显示st(因为StackPanel确实有个Name属性叫st,呵呵),性别没显示~~

//------------------------------------------------------------

我们上面也看到了,如果是wpf提供的元素之间的绑定,是很简单的,而自定义的属性,虽然借助了DataContext属性这个特性,

但是结果仍然不尽人意,那么如何把自定义元素打造成和wpf提供的元素一样呢?我们还得从长计议~~

好!我们就来对People类,进行“大”改造!

 class People : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;//这个事件名字不能改的,因为是在INotifyPropertyChanged里定义好的! private string name = "我是谁?"; public string Name
{
get { return name; }
set
{
name = value;
//激发事件
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));//ProgressChangedEventArgs之前居然写成这个。罪过啊!
}
}
} private string sex = "人妖"; public string Sex
{
get { return sex; }
set
{
sex = value;
//激发事件
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Sex"));//ProgressChangedEventArgs之前居然写成这个。罪过啊!
}
}
} public void Call()
{
name = "Hi,我是宋桓公";
sex = "男";
MessageBox.Show(name+"--"+sex);
}
}

成功的关键,有下面几点:
1、需添加程序集:using System.ComponentModel;
2、:INotifyPropertyChanged ,让自定义类继承这个接口;
3、 public event PropertyChangedEventHandler PropertyChanged;//这个事件名字不能改的,因为是在INotifyPropertyChanged里定义好的!
4、set中激发这个事件,PropertyChangedEventArgs不要写成ProgressChangedEventArgs,衰。。都是自动提示
惹的祸~~~
5、先看看效果,没效果,写这么多点都是扯淡对吧~~
好,就改造这个类这么多,其他都不改,运行下——结果真的没效果(啊!!!!!),找下原因:
name = "Hi,我是宋桓公";
sex = "男";
Call方法里,改变的是字段,而不是属性;而激发事件PropertyChanged的条件是属性发生改变!
所以Call改成:
public void Call()
{
   Name = "Hi,我是宋桓公";
   Sex = "男";
}

这样就OK了~~,我们的自定义属性,就可以像WPF提供的元素那样“自由”绑定了~~
所以,真正的第5点是:注意改变属性的值,才能触发PropertyChanged事件!

全方位Bindind分析的更多相关文章

  1. Java 远程通讯技术及原理分析

    在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些 ...

  2. Java远程通讯技术及原理分析

    在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些 ...

  3. 市场竞争白热化,Smartbi Excel分析助力企业提高核心竞争力

    ​近年来,随着企业的数字化转型,数据已经成为企业的重要资产,用来支撑其业务决策.对业务数据进行全方位的分析,及时发现问题,调整经营策略,是企业做大做强的必要手段之一.特别是在市场竞争白热化的行业,更需 ...

  4. BI报表系统在银行业的应用

    在当前大数据的背景下,银行业传统联机业务技术存在开发周期长.不够灵活.大量的业务数据难以充分利用.操作复杂.监控效率低等弊端,多数企业表示需要搭建一个符合银行特色的商业智能平台,把需要的数据和信息集中 ...

  5. DSP, SSP, DMP

    先了解下广告的产业链有哪些人群: 广告主advertisers 显然是指想为自己的品牌或者产品做广告的人,例如宝马.Intel.蒙牛-- 媒体publisers       则是提供广告位置的载体,例 ...

  6. .Net 三款工作流引擎比较:WWF、netBPM 和 ccflow

    下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三款创建流程的过程.这三款工作流程引擎分别是 Windows Workflow Found ...

  7. 用最直白的语言告诉你,hadoop是什么?

    hadoop应历史之潮流,随着理论探索.科学技术试验的不断开展,hadoop终于2006年问世,惊天地泣鬼神! hadoop雏形开始于2002年的Apache的Nutch,Nutch是一个开源Java ...

  8. .net开源工作流引擎ccflow

    关于济南驰骋信息技术有限公司的.net开源工作流引擎 驰骋工作流引擎,工作流程管理系统:简称ccflow,驰骋一体化解决方案简称ccport. ccflow是济南驰骋信息技术有限公司向社会提供的一款1 ...

  9. (转)iOS Wow体验 - 第二章 - iOS用户体验解析(2)

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第二章译文精选的第二部分,其余章节将陆续放出.上一 ...

随机推荐

  1. LeetCode题解之Binary Number with Alternating Bits

    1.题目描述 2.问题分析 将数值转换为二进制,然后将前面的 0 去掉,再遍历一边二进制字符串,对每个字符和其后部的字符进行比较. 3.代码 bool hasAlternatingBits(int n ...

  2. PHP检测数组中的每个值是否含有特殊字符

    本文出至:新太潮流网络博客 /** * [TestArray 检测数组是一维还是二维] * @E-mial wuliqiang_aa@163.com * @TIME 2017-04-07 * @WEB ...

  3. excel文件使用navicat工具导入mysql的方法

    1.在excel文件的sheet上,第1行下面插入一行,对应DB里面的字段名称,方便后面导入时做字段匹配: 2.使用Navicat ,打开工具,选择表所在的数据库,然后点击数据库名字,右键Tables ...

  4. 通过ajax GET方式查询数据,Django序列化objects

    点击“查找2”按钮,通过ajax GET方式进行查询数据,这样页面不需要整体刷新,之后清空tbody数据,将查询结果重新附加到tbody 前端html: <div class="box ...

  5. Eclipse中Tomcat的配置

    1.Window-Preferences-Server-Runtime Environments 2.点击Add,选择相应的Tomcat版本,我的是7.0的所以我选择这个.并勾选Create a ne ...

  6. beta冲刺————第二天(2/5)

    完善具体内容: 前端: (1)添加了更多设置 (2)点击后出现底栏,分别可以进行字体背景设置.收藏.分享等操作,同时可以看出对文章的排版进行了完善 后端: 对阿里云服务器中的环境进行配置,同时熟悉阿里 ...

  7. initialProps被React-Navigation的navigation属性覆盖解决方案

    怎么开场对我来说一个是个很纠结的问题,Emmm这应该算个好开场. 最近在做一个RN的app端调试工具,在把它嵌入原生app中的时候遇到了一个问题,RN组件里面接受不到原生传过来的initialProp ...

  8. HTML标签之marquee

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zkn_CS_DN_2013/article/details/25229719 <html> ...

  9. VS2012中使用SOS调试CLR

    之前看了<用WinDbg探索CLR世界>的一些列文章,发现SOS真的是一个非常好的调试.net的工具, 然后又惊喜的在http://blogs.msdn.com/b/marioheward ...

  10. 【洛谷】【动态规划+单调队列】P1714 切蛋糕

    [题目描述:] 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但 ...