gpt4 book ai didi

c# - 如何使用 lambda 表达式更新属性?

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:28 24 4
gpt4 key购买 nike

我有以下类(class):

public class MyClass
{
public int? Field1 { get; set; }
public int? Field2 { get; set; }
}

表单上的文本框控件通过 BindingSource 绑定(bind)到此类的实例,并且数据源在 OnValidated 事件上更新。

但是,当文本框为空时,它所绑定(bind)的属性不会更新(再次显示之前的值):

因此,在控件的 OnValidating 事件中,我添加了以下内容:

int value;
bool ok = int.TryParse(((TextBox)sender).Text, out value);
if (!ok)
{
myClassInstance.Field1 = null;
}

问题:

  1. TextBox 的值为空时,以上是 BindingSource 的正常行为吗?

  2. 是否可以有一个我可以在我的 OnValidating 事件中调用的通用方法。像这样的东西:

    OnValidatingMethod((TextBox)sender, x => x.Field1);

上面这行代码显然是行不通的,因为没有引用对象实例。但我想知道这样的事情是否可能?也许是类(class)的扩展:

myClassInstance.SetProperty(((TextBox)sender).Text, x => x.Field1);

最佳答案

数据绑定(bind)的整个思想是从源中抽象出目标。如果您创建了这样的事件处理程序,那么抽象就结束了。

你看到的当然是不正常的,但这是为了“向后兼容”而保留的非常古老的错误的结果。很久以前就通过向 Binding 添加附加属性来修复它类,但同样为了向后兼容,默认值设置为模仿旧行为。

要使其按预期工作,您需要设置的属性是 FormattingEnabledtrue,并且 NullValue""。我通常使用允许指定所有信息的 DataBindings.AddBinding 构造函数重载之一,如下所示:

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

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

关于c# - 如何使用 lambda 表达式更新属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36787745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com