• 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

  • 相关阅读:
    磁盘冗余阵列之RAID 5
    磁盘冗余阵列之RAID10
    Linux常见的命令与vi的介绍
    通过挂在系统光盘搭建本地yum
    Windows 2008 系统安装
    在windows主机中,利用XSHELL生成“密钥”进行虚拟机与物理机的传输
    在VMware下进行的使用ssh服务管理远程主机
    Linux中的快捷方式
    Linux中常用命令
    Linux中vi命令的详细总结
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605076.html
Copyright © 2020-2023  润新知