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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值