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

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

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

C#利用Lambda和Expression实现数据的动态绑定的更多相关文章

  1. 使用Expression实现数据的任意字段过滤(1)

    在项目常常要和数据表格打交道. 现在BS的通常做法都是前端用一个js的Grid控件, 然后通过ajax的方式从后台加载数据, 然后将数据和Grid绑定. 数据往往不是一页可以显示完的, 所以要加分页: ...

  2. Speedment -- 利用lambda编写SQL

    众所周知Java8中加入了lambda语法,这一特性也帮助Java开发者极大的简化了开发.Speedment是一个利用lambda表达式操作数据库的框架,相比Java世界中现在非常流行的mybatis ...

  3. 使用Expression实现数据的任意字段过滤(2)

    上一篇<使用Expression实现数据的任意字段过滤(1)>, 我们实现了通过CriteriaCollectionHandler对象来处理集合数据过滤.通过适当的扩展, 应该可以满足一般 ...

  4. 利用lambda和Collection.forEach

    2.外部VS内部迭代 以前Java集合是不能够表达内部迭代的,而只提供了一种外部迭代的方式,也就是for或者while循环. 1 2 3 4 List persons = asList(new Per ...

  5. 优雅实现INotifyPropertyChanged接口——利用Lambda表达式

    原文:优雅实现INotifyPropertyChanged接口--利用Lambda表达式 参考文章 在14年的时候,曾经读过上面的参考文章,不过当时并没有怎么理解,慢慢地也就将这篇文章忘诸脑后了. 直 ...

  6. 利用SQl对数据库实行数据拆分与组合

    利用SQl对数据库实行数据拆分与组合实现提供以下几种方案: 方法一: WITH CTE AS (SELECT A.Id,A.[Uid],UserName FROM (SELECT A.[id], RE ...

  7. 谈谈Java利用原始HttpURLConnection发送POST数据

    这篇文章主要给大家介绍java利用原始httpUrlConnection发送post数据,设计到httpUrlConnection类的相关知识,感兴趣的朋友跟着小编一起学习吧 URLConnectio ...

  8. 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择

    在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便.在我很早之前的一篇博客& ...

  9. C#利用lambda在函数中创建内部函数

    有使用过JS的朋友,相信都知道function.JS中的function是可以在里面在定义一个作为内部使用的.有时为了控制作用域,或者这种小函数只在这个函数体内会使用,所以就不希望在外部在作额外的定义 ...

随机推荐

  1. git pull 出错 fatal: Could not read from remote repository.Please make sure you have the correct access rights.and the repository exists.

    Warning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hos ...

  2. 从零开始学C++之IO流类库(三):文件的读写、二进制文件的读写、文件随机读写

    一.文件的读写 如前面所提,流的读写主要有<<, >>, get, put, read, write 等操作,ofstream 继承自ostream, ifstream 继承自 ...

  3. [置顶] C++ Pirate: Lambda vs Bind

    Lambda 与 Bind的性能比较 转载请说明出处:http://blog.csdn.net/cywosp/article/details/9379403 先让我们看看下面函数: template ...

  4. (记录前面算过的后面仍然会用的数减小复杂度)A - AC Me

    Description Ignatius is doing his homework now. The teacher gives him some articles and asks him to ...

  5. BZOJ 1053 反素数ant

           初读这道题,一定有许多疑惑,其中最大的疑惑便是"反素数",反素数的概念很简单,就是,a<b同时a的因数个数大于b的因数个数.但是想要完成本题还需要一些信息,关于 ...

  6. java 如何自定义异常 用代码展示 真心靠谱

    先建两个自定义的异常类 ChushufuException类 class ChushufuException extends Exception { public ChushufuException( ...

  7. Redis中的value包含中文显示的问题?

    linux 系统 redis不识别中文  如何显示中文 在Redis中存储的value值是中文“马拉斯加”Shell下get获取后展示的结果为:\xc2\xed\xc0\xad\xcb\xb9\xbc ...

  8. mysql自动备份(windows)

    许多时候,为了数据安全,我们的mysql数据库需要定期进行备份,下面介绍两种在windows下自动备份方法: 1.复制date文件夹备份 ============================ 例子 ...

  9. JVM--Garbage First

    Garbage First Garbage First 简称 G1,它的目标是要做到尽量减少 GC 所导致的应用暂停的时间,让应用达到准实时的效果,同时保持 JVM 堆空间的利用率,其最大的特色在于允 ...

  10. POJ 1159 回文LCS滚动数组优化

    详细解题报告可以看这个PPT 这题如果是直接开int 5000 * 5000  的空间肯定会MLE,优化方法是采用滚动数组. 原LCS转移方程 : dp[i][j] = dp[i - 1][j] + ...