Binding在WPF中的使用
闲来无事,不想打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层控件显示新的值。
有卖就有买,下面是它的目标控件
<Window x:Class="Binding1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="" Width="">
<StackPanel>
<TextBox x:Name="txtBoxName" BorderBrush="Black" Margin=""></TextBox>
<Button Content="AddAge" Margin="" Click="Button_Click"></Button>
</StackPanel>
</Window>
写了一个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 += "屎兔子";
}
好了,一个简单的例子写到这里,明天继续详细学习。(下午下午媳妇一直问我那个疯狂猜图的答案,表示我也迷恋了,去玩会儿~)
Binding在WPF中的使用的更多相关文章
- WPF binding<一> Data Binding在WPF中的地位
在代码中看到 <Image Source="{Binding ElementName=LBoxImages, Path=SelectedItem.Source}" /> ...
- 【转】WPF中Binding的技巧(一)
WPF中Binding的技巧(一) 在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到 ...
- 【转】WPF中的Binding技巧(二)
WPF中的Binding技巧(二) 接上篇, 我们来看一看Elementname,Source,RelativeSource 三种绑定的方式 1.ElementName顾名思义就是根据Ui元素 ...
- WPF中Binding使用StringFormat格式化字符串方法
原文:WPF中Binding使用StringFormat格式化字符串方法 货币格式 <TextBlock Text="{Binding Price, StringFormat={}{0 ...
- 整理:WPF中Binding的几种写法
原文:整理:WPF中Binding的几种写法 目的:整理WPF中Bind的写法 <!--绑定到DataContext--> <Button Content="{Bindin ...
- 解读WPF中的Binding
1.Overview 基于MVVM实现一段绑定大伙都不陌生,Binding是wpf整个体系中最核心的对象之一这里就来解读一下我花了纯两周时间有哪些秘密.这里我先提出几个问题应该是大家感兴趣的,如下: ...
- MVVM模式和在WPF中的实现(二)数据绑定
MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- WPF入门教程系列十八——WPF中的数据绑定(四)
六.排序 如果想以特定的方式对数据进行排序,可以绑定到 CollectionViewSource,而不是直接绑定到 ObjectDataProvider.CollectionViewSource 则会 ...
- WPF入门教程系列十五——WPF中的数据绑定(一)
使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能.WPF的数据绑定跟Winform与ASP.NET中的数 ...
随机推荐
- myisam MySQL 锁问题
2016-07-23 (点击上方公众号,可快速关注) 来源:阿里云 RDS - 数据库内核组 链接:http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近 ...
- c#基础语言编程-文件流操作
引言 在System.IO 命名空间下提供了一系列的类,我们可以通过相应的类进行文件.目录.数据流的操作. 1.File类:提供用于创建.复制.删除.移动和打开文件的静态方法.File类 2.File ...
- 各种Markdown处理器的列表
从MarkdownImplementations - Markdown Community Group可以找到一个实现markdown处理器的列表,如下: Name Language Type Des ...
- windows下 tomcat7 配置成服务
最简单方法:下载windows安装版,下一步下一步搞定! 非安装版: 1.下载tomcat7 windows版 2.首先找到F:\apache\bin\service.bat(不同的计算机Tomcat ...
- 遍历datatable的几种方法【转载】
遍历datatable的方法2009-- :02方法一: DataTable dt = dataSet.Tables[]; ; i < dt.Rows.Count ; i++) { string ...
- oracle中 sql%rowcount 使用方法
sql%rowcount用于记录改动的条数,必须放在一个更新或者删除等改动类语句后面运行,select语句用于查询的话无法使用, 当你运行多条改动语句时,依照sql%rowcount 之前运行的最后一 ...
- RSA 加解密 签名 示例
import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStrea ...
- startActivityForResult和setResult详解
http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html startActivityForResult与startActivi ...
- SDK Manager.exe 无法启动,一闪而过的解决办法
删掉 C:\Windows\system32\ 下的 java.exe.javaw.exe.javaws.exe 即可解决.(转载)
- session marked for kill处理oracle中杀不掉的锁
ora-00031:session marked for kill处理oracle中杀不掉的锁 一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长 ...