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

原创粉丝点击