zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Fedora 14 安装完后的设置 添加源 更新软件
    visual studio NuGet 常用包管理命令
    ubuntu通过cifs-utils访问Windows共享目录
    C# 数据库写入Sql Bulk索引损坏异常问题System.InvalidOperationException: DataTable internal index is corrupted: '4'
    C# IEnumerable to List 的转换
    python 端口扫描
    ubuntu 关闭 phpmyadmin
    zendframework 初始化配置
    zend-form笔记
    DirectX 图形流水线
  • 原文地址:https://www.cnblogs.com/pangblog/p/3289980.html
Copyright © 2011-2022 走看看