博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Binding在WPF中的使用
阅读量:5317 次
发布时间:2019-06-14

本文共 2399 字,大约阅读时间需要 7 分钟。

闲来无事,不想打DOTA,在这里小小研究下wpf中关于Binding的东西。

咯咯


在我们印象中,Binding的意思是“绑定”,这个“绑”大概取自于Bind这个单词吧,这么理解的话就是以音译英了,没什么实际意义。

Bind这个单词的动词形式是Binding,看看字典就知道除了前面说的“捆绑”之外,还有“键联”,“关联”的意思。比如原子键联(atomic binding),化学键联(binding-beam)等。也就是说啦,Binding更注重于表达的是一种“关系”,而不是一个动作。如果把Binding比作数据的桥梁,那么它的两端分别是Binding的源(Source)和目标(Target)。它描述了数据从哪来到哪去,一般情况下Binding的源是逻辑层的对象,目标是表现层(UI)的控件对象,我们不但可以控制源与目标之间双向或者单向的道路,还可以控制对数据的放行机制。那么下面我来搞一个简单的例子。

先做一个源数据,一个来自于逻辑层的对象

class Student{  private string name;  public string Name  {     get{
return name;} set{name = value;} }}

属性是有了,可是我的目标完全不知道当我的属性发生变化时,源怎么通知我的目标,告诉它源数据变化了?所以,这样一个简单的类显然不科学。完善一下它,让它去继承

System.ComponentModel下的INotifyPropertyChanged接口就行了

那么完整的类应该是这个样子

class Student:INotifyPropertyChanged{  public event PropertyChangedEventHandler PropertyChanged;  private string name;  public string Name  {     get{
return name;} set{ name = value; //在set中激发 PropertyChanged事件 if(this.PropertyChanged!=null) { this.PropertyChanged.Invoke(this,new PropertyChangedEventArgs("Name")); } } } }

看,当为Binding设置了数据源之后,它会自动监听来自PropertyChanged这个接口的事件,Name发生变化,触发propertyChanged事件,Binding监听到了触发的事件,它会告诉UI层的控件Name这个属性的值发生变化,通知UI层控件显示新的值。

有卖就有买,下面是它的目标控件

写了一个TextBox作为Binding的目标和一个按钮Button来触发改变Name值得事件。

然后就是介绍他们俩认识的时候了。。。

public partial class MainWindow : Window    {        Student stu;        public MainWindow()        {            InitializeComponent();            //准备数据源            stu = new Student();            //把stu.Name作为Binding的数据源            Binding binding = new Binding();            binding.Source = stu;            binding.Path = new PropertyPath("Name");            //使用Binding连接源和目标,把stu的Name属性值联系到一个叫做"txtBoxName"的TextBox上去            BindingOperations.SetBinding(this.txtBoxName, TextBox.TextProperty, binding);        }        private void Button_Click(object sender, RoutedEventArgs e)        {            stu.Name += "屎兔子";        }    }

运行效果

当然,也可以把上面的代码这么写,借助Binding类构造器和C#3.0的对象初始化语法来简化代码

public Window1(){   InitializeComponent(); this.txtBoxName.SetBinding(TextBox.TextProperty,new Binding("Name"){Source = stu = new Student()});}
private void Button_Click(object sender, RoutedEventArgs e){            stu.Name += "屎兔子";}

好了,一个简单的例子写到这里,明天继续详细学习。(下午下午媳妇一直问我那个疯狂猜图的答案,表示我也迷恋了,去玩会儿~)

 

 

转载于:https://www.cnblogs.com/Mushrooms/p/3142559.html

你可能感兴趣的文章
vue-devtools 获取到 vuex store 和 Vue 实例的?
查看>>
内存地址对齐
查看>>
yum 命令跳过特定(指定)软件包升级方法
查看>>
创新课程管理系统数据库设计心得
查看>>
Could not resolve view with name '***' in servlet with name 'dispatcher'
查看>>
pandas 修改指定列中所有内容
查看>>
lua语言入门之Sublime Text设置lua的Build System
查看>>
vue.js基础
查看>>
电脑的自带图标的显示
查看>>
[转载] redis 的两种持久化方式及原理
查看>>
C++ 删除字符串的两种实现方式
查看>>
ORA-01502: 索引'P_ABCD.PK_WEB_BASE'或这类索引的分区处于不可用状态
查看>>
Java抽象类和接口的比较
查看>>
MyBaits学习
查看>>
管道,数据共享,进程池
查看>>
CSS
查看>>
[Cypress] Stub a Post Request for Successful Form Submission with Cypress
查看>>
UNITY在VS中调试
查看>>
SDUTOJ3754_黑白棋(纯模拟)
查看>>
Scala入门(1)Linux下Scala(2.12.1)安装
查看>>