C#利用Lambda和Expression实现数据的动态绑定
2013-08-29 19:03
561 查看
在程序开发过程中,有时为了让数据能够实时更新,我们会采用数据绑定来实现。
一般我们数据绑定时我们是这样写的
其中Helper是继承接口INotifyPropertyChanged,因为数据绑定的实现主要依赖于INotifyPropertyChanged接口。
如果要实现双向数据绑定(即数据源Helper.statusInfo_pro改变了会影响绑定的控件,绑定的控件数据改变了会自动更新到数据源Helper.statusInfo_pro上),这时需要修改binding的实现,具体如下:
但是,在开发时,每次在数据绑定时都要写绑定控件和绑定数据源对应字段的名字,即"Text"和"statusInfo_pro",有时稍加不注意就会写错,这样就会导致绑定数据出错,或者绑定失败。那有没有什么办法可以改善呢?
如果能够在数据绑定时这样写
那么就不会出现写错的问题。因为Text是textbox1的属性,statusInfo_pro是helper的属性。
基于这种想法,最终采用Lambda和Expression实现。其实现代码如下:
其中fetchPropertyName中的参数Expression<Func<T>> property在调用时使用了lambda表达式来传递参数。
虽然没有达到预想的直接写textbox1.Text,但换用了fetchPropertyName(() =>textbox1.Text)来实现,也是达到了目的。
转载请注明出处http://blog.csdn.net/xxdddail/article/details/10484327
一般我们数据绑定时我们是这样写的
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实现数据的动态绑定
- 利用JQuery+Ajax实现aspx页面无刷新的动态数据绑定
- 利用autocomplete.js实现仿百度搜索效果(ajax动态获取后端[C#]数据)
- 利用override多态原理实现对相似页面的后台代码的抽象,并实现动态GridView动态列数据绑定
- 利用JQuery+Ajax实现aspx页面无刷新的动态数据绑定
- C#实现的多列数据绑定组合框控件MultiColumnComboBoxEx
- c# winform comboBox动态绑定数据
- 《EasyUI》——给DataGrid动态绑定表头和数据,实现表头与数据的真正解耦
- 利用C#动态编译功能实现像Javascript中的Eval的功能来将一段字符串进行数学运算
- 报错No mapping found for HTTP request with URI、实现蒙纱,弹出对话框利用load 、编码问题、 jQ的data绑定数据等等遇到的问题
- 转:c# winform comboBox动态下拉列表,comboBox动态绑定数据库里的数据
- jsp中实现利用数据库中的数据动态拼接select的option
- 使用zTree实现导航树、angular实现数据动态绑定功能
- 实现C#绑定数据并与flash交互,向flash抛参,并用到触发器实时显示处理
- C# :实现水印与图片合成,并利用Graphics 压缩图像质量 , (委托实现listBox的动态添加提示)。。。。。。。。。。。。
- C#:简单实现动态数据生成Word文档并保存
- c# 模仿 vue 实现 winform 的数据模型双向绑定
- vue.js利用defineProperty实现数据的双向绑定
- ASP.NET MVC中 Jquery AJAX 获取数据利用MVC模型绑定实现输出
- C#中利用ODP实现瞬间导入百万级数据详解