0

我遇到了一种情况,我想在 POCO 属性和 TextBox 之间设置一些数据绑定。当然,您可以使用 BindingSource 和控件的 DataBindings 集合来执行此操作,但是 BindingSource 需要 DataSource 和 DataMember,并且实际上对 POCO 不友好。(BindingSource 似乎需要一个表格数据源,而不是单行。)所以,我有一个 DataSource,但没有 DataMember。

我通过使用反射的 TextBox 扩展方法实现了这一点,将 POCO 对象和属性作为字符串传递给绑定:

public static void Bind(this TextBox textBox, object dataObject, string propertyName)
{
    PropertyInfo property = dataObject.GetType().GetProperty(propertyName);
    textBox.Text = property.GetValue(dataObject, null).ToString();
    textBox.TextChanged += delegate(object sender, EventArgs e)
{
    PropertyInfo pi = dataObject.GetType().GetProperty(propertyName);
    pi.SetValue(dataObject, textBox.Text, null);
    };          
}

在我的情况下,调用代码如下所示:

tbProjectConnection.Bind(_modelBuilder, "ProjectConnection");
tbOutputFolder.Bind(_modelBuilder, "OutputFolder");
chkWebMatrix.Bind(_modelBuilder, "UseWebMatrix");
tbNamespace.Bind(_modelBuilder, "ProjectNamespace");
tbDbClassName.Bind(_modelBuilder, "DbClassName");

在我的示例中,_modelBuilder 是一个 DataSet 对象,显示的属性(“ProjectConnection”、“OutputFolder”等)是 DataSet 的简单字符串属性——不是数据集中的记录,而是整个数据集的属性。

我并不热衷于将属性名称作为字符串传递,并且想知道是否可以将此函数重写为 lambda,因此在调用时它看起来像这样:

tbProjectConnection.Bind(property => _modelBuilder.ProjectConnection);
tbOutputFolder.Bind(property => _modelBuilder.OutputFolder);

我是 lambdas 的新手,所以非常感谢任何帮助!

4

1 回答 1

1

我不认为有一个简单的方法可以做到这一点,但有一篇非常有趣的文章:

http://joelabrahamsson.com/getting-property-and-method-names-using-static-reflection-in-c/

这可能会给你你正在寻找的东西,虽然它看起来并不简单。

于 2013-08-12T13:02:31.477 回答