我遇到了一种情况,我想在 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 的新手,所以非常感谢任何帮助!