在程序开发过程中,有时为了让数据能够实时更新,我们会采用数据绑定来实现。
一般我们数据绑定时我们是这样写的
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