C#利用Lambda和Expression实现数据的动态绑定
来源:互联网 发布:ios存照片软件 编辑:程序博客网 时间:2024/05/17 22:53
在程序开发过程中,有时为了让数据能够实时更新,我们会采用数据绑定来实现。
一般我们数据绑定时我们是这样写的
public class Helper : INotifyPropertyChanged { #region statusInfo Property private string statusInfo_ = ""; public string statusInfo_pro { get { return statusInfo_; } set { if (value == statusInfo_) { return; } statusInfo_ = value; NotifyPropertyChanged(() => statusInfo_pro); } } #endregion #region statusInfo NotifyPropertyChanged public void NotifyPropertyChanged<T>(Expression<Func<T>> property) { if (PropertyChanged == null) { return; } var memberExpression = property.Body as MemberExpression; if (memberExpression == null) { return; } PropertyChanged.Invoke(this, new PropertyChangedEventArgs(memberExpression.Member.Name)); } public event PropertyChangedEventHandler PropertyChanged; #endregion }private Helper helper_=new Helper();private void binding(){ textbox1.DataBindings.Add("Text",helper,"statusInfo_pro");}
其中Helper是继承接口INotifyPropertyChanged,因为数据绑定的实现主要依赖于INotifyPropertyChanged接口。
如果要实现双向数据绑定(即数据源Helper.statusInfo_pro改变了会影响绑定的控件,绑定的控件数据改变了会自动更新到数据源Helper.statusInfo_pro上),这时需要修改binding的实现,具体如下:
private void binding(){ textbox1.DataBindings.Add("Text",helper,"statusInfo_pro",false,DataSourceUpdateMode.OnPropertyChanged);}
但是,在开发时,每次在数据绑定时都要写绑定控件和绑定数据源对应字段的名字,即"Text"和"statusInfo_pro",有时稍加不注意就会写错,这样就会导致绑定数据出错,或者绑定失败。那有没有什么办法可以改善呢?
如果能够在数据绑定时这样写
private void binding(){ textbox1.DataBindings.Add(textbox1.Text,helper,helper.statusInfo_pro,false,DataSourceUpdateMode.OnPropertyChanged);}那么就不会出现写错的问题。因为Text是textbox1的属性,statusInfo_pro是helper的属性。
基于这种想法,最终采用Lambda和Expression实现。其实现代码如下:
private void binding(){ textbox1.DataBindings.Add(fetchPropertyName(() =>textbox1.Text), helper, fetchPropertyName(() => helper.statusInfo_pro), false, DataSourceUpdateMode.OnPropertyChanged );} #region fetchPropertyName Function public static string fetchPropertyName<T>(Expression<Func<T>> property) { MemberExpression memberExpression = property.Body as MemberExpression; if (memberExpression == null) { return null; } return memberExpression.Member.Name; } #endregion
其中fetchPropertyName中的参数Expression<Func<T>> property在调用时使用了lambda表达式来传递参数。
虽然没有达到预想的直接写textbox1.Text,但换用了fetchPropertyName(() =>textbox1.Text)来实现,也是达到了目的。
转载请注明出处http://blog.csdn.net/xxdddail/article/details/10484327
- C#利用Lambda和Expression实现数据的动态绑定
- c# lambda expression
- 利用defineProperty实现数据的双向绑定
- Lambda中Func和Expression的区别
- 利用JQuery+Ajax实现aspx页面无刷新的动态数据绑定
- 利用JQuery+Ajax实现aspx页面无刷新的动态数据绑定
- C#利用lambda实现委托事件的挂接
- C#利用lambda实现委托事件的挂接
- C# 动态绑定实体数据
- C# Lambda Expression概念浅析
- C# Lambda Expression概念浅析
- 利用override多态原理实现对相似页面的后台代码的抽象,并实现动态GridView动态列数据绑定
- 利用 JavaScript 数据绑定实现一个简单的 MVVM 库
- 使用Expression动态创建lambda表达式
- 《EasyUI》——给DataGrid动态绑定表头和数据,实现表头与数据的真正解耦
- C# Delegate ,Anonymous methods,lambda expression
- C#学习笔记(十一)-实现Windows程序的数据绑定
- DataGridView动态的绑定数据
- HDU 3853 概率DP
- Qt 文件读写
- fileziller 恢复 站点管理器 内的ftp帐号方法
- SQL判断表或存储过程是否存在,若存在则删除然后重新创建
- 23 C# 第十九章(一) 基于 .Net 4 TPL 的同步和线程处理模式
- C#利用Lambda和Expression实现数据的动态绑定
- UCOS中断函数的编写
- Windows Phone后台音乐详解一
- 从M个数中随机选出N个数的所有组合,有序,(二)
- 爬虫
- python challenge <八>
- java多线程抓取新闻
- Error to improve
- UML交互视图