C#利用Lambda和Expression实现数据的动态绑定

在程序开发过程中,有时为了让数据能够实时更新,我们会采用数据绑定来实现。

一般我们数据绑定时我们是这样写的

 

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

 

你可能感兴趣的:(express)