Generic CheckBox Creator 函数添加带有引用 属性 的匿名事件处理程序

Generic CheckBox Creator function adding anonymous event handlers with referenced property

我想为 Windows 创建一堆简单的复选框并让它们更改布尔值。因为它们很多,我想我可以跳过编写一堆 CheckedChanged 处理程序并拥有一个像这样的通用“Creator”函数

    static CheckBox CreateCheckBox(ref bool binding, string name)
    {
        var box = new CheckBox();
        box.Checked = binding;
        box.CheckedChanged += (object sender, EventArgs e) => { binding = !binding; };
        box.Text = name;
        return box;
    }

然后像这样创建我的盒子:

ParentForm.Controls.Add(CreateCheckBox(ref prop1, nameof(prop1));
ParentForm.Controls.Add(CreateCheckBox(ref prop2, nameof(prop2));
.....

我显然得到了“不能在 lambda 表达式或匿名函数中使用 ref”。我仔细阅读了它,这是有道理的。 但是有没有一种方法可以拥有这种通常添加处理程序的简单创建者函数?

我知道从不删除处理程序会出现问题,但这是针对调试模式功能的,开发人员仅使用该功能来调试和改进 specific.algorithm。 也许我只是懒得写和添加所有的处理程序,但我也觉得更干净了。

您不需要通过引用传递任何内容,使用以下选项之一:

  1. 传递一个 getter Func 和一个 setter Action
  2. 设置数据绑定

示例 1 - 传递 getter Func 或 setter Action

将 getter 和 setter 作为 func/action:

public CheckBox CreateCheckBox(string name, Func<bool> get, Action<bool> set)
{
    var c = new CheckBox();
    c.Name = name;
    c.Text = name;
    c.Checked = get();
    c.CheckedChanged += (obj, args) => set(!get());
    return c;
}

并像这样使用它,例如:

CreateCheckBox("checkBox1", () => textBox1.Enabled, (x) => textBox1.Enabled = x);
CreateCheckBox("checkBox2", () => textBox2.Enabled, (x) => textBox2.Enabled = x);

示例 2 - 设置数据绑定

您要实现的是您可以通过设置数据绑定实现的:

public CheckBox CreateCheckBox(string name, object dataSource, string dataMember)
{
    var c = this.Controls[name] as CheckBox;
    c.Name = name;
    c.Text = name;
    c.DataBindings.Add("Checked", dataSource,
        dataMember, false, DataSourceUpdateMode.OnPropertyChanged);
    return c;
}

并像这样使用它:

CreateCheckBox("checkBox1", textBox1, "Enabled");
CreateCheckBox("checkBox2", textBox2, "Enabled");