C# 如何使用lambda表达式更新属性?
我有以下课程:C# 如何使用lambda表达式更新属性?,c#,data-binding,lambda,expression-trees,bindingsource,C#,Data Binding,Lambda,Expression Trees,Bindingsource,我有以下课程: public class MyClass { public int? Field1 { get; set; } public int? Field2 { get; set; } } 表单上的文本框控件通过BindingSource绑定到此类的实例,数据源在OnValidated事件中更新 但是,当文本框为空时,它绑定到的属性不会被更新(将再次显示以前的值): 因此,在控件“OnValidating事件中,我添加了以下内容: int value; bool ok
public class MyClass
{
public int? Field1 { get; set; }
public int? Field2 { get; set; }
}
表单上的文本框控件通过BindingSource
绑定到此类的实例,数据源在OnValidated
事件中更新
但是,当文本框为空时,它绑定到的属性不会被更新(将再次显示以前的值):
因此,在控件“OnValidating
事件中,我添加了以下内容:
int value;
bool ok = int.TryParse(((TextBox)sender).Text, out value);
if (!ok)
{
myClassInstance.Field1 = null;
}
问题:
文本框
的值为空时,绑定源
的上述行为是否正常OnValidatingMethod((TextBox)sender, x => x.Field1);
myClassInstance.SetProperty(((TextBox)sender).Text, x => x.Field1);
数据绑定的整个思想是从源代码中抽象出目标。如果您创建这样的事件处理程序,抽象就结束了 当然,您看到的不是正常的,而是为“向后兼容”而保留的一个非常旧的bug的结果。很久以前,通过向类添加其他属性,它已经得到了修复,但是为了向后兼容,默认值被设置为模仿旧的行为 要使其按预期工作,需要设置的属性为
true
,以及“”
。我通常使用一个数据绑定。添加或绑定构造函数重载,允许指定所有这些信息,如下所示:
textBox.DataBindings.Add("Text", bs, "Field1", true, DataSourceUpdateMode.OnValidation, "");
这是一个完整的演示:
using System;
using System.Windows.Forms;
namespace Samples
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form = new Form();
var textBox1 = new TextBox { Parent = form, Left = 16, Top = 16 };
var textBox2 = new TextBox { Parent = form, Left = 16, Top = textBox1.Bottom + 16 };
var bs = new BindingSource { DataSource = typeof(MyClass) };
textBox1.DataBindings.Add("Text", bs, "Field1", true, DataSourceUpdateMode.OnValidation, "");
textBox2.DataBindings.Add("Text", bs, "Field2", true, DataSourceUpdateMode.OnValidation, "");
bs.DataSource = new MyClass { Field1 = 1, Field2 = 2 };
Application.Run(form);
}
}
public class MyClass
{
public int? Field1 { get; set; }
public int? Field2 { get; set; }
}
}
最后,如果您真的想参与解析部分,您应该将处理程序附加到事件。谢谢您的解释,和往常一样,回答得很好!