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; }
        }
    }
    

    最后,如果您真的想参与解析部分,您应该将处理程序附加到事件。

    谢谢您的解释,和往常一样,回答得很好!