将Winform绑定到字典或键/值列表

本文关键字:列表 字典 Winform 绑定 | 更新日期: 2023-09-27 18:28:57

我有一个Winforms应用程序,它动态实例化外部表单对象,以便在配置UI中使用。每个动态实例化的表单都放置在一个TabPage中。

我想创建一个接受Dictionary或Key/Value列表的属性,并用这些值填充表单,使控件的值与字典中Key的值相匹配。相反,该属性还将返回一个键/值列表,该列表对应于Winform中控件的值。

这是一个简单的绑定问题,还是我需要编写自定义代码?那个代码会是什么样子?

在过去,我通过编写一个DTO类,使用XML序列化和反序列化来持久化类的数据,并将表单字段连接到DTO对象的字段来实现这一点。问题是,由于表单是从外部DLL动态实例化的,因此无法静态地"引用"这个DTO类,因此我正在寻找一种更动态的方法。

将Winform绑定到字典或键/值列表

结果比我想象的要容易。

public Dictionary<string, string> Values
{
    get
    {
        var values = new Dictionary<string, string>();
        foreach (var control in Controls)
        {
            switch(control.GetType().Name) 
            {
                case "TextBox" : 
                    var textBox = (TextBox)control;
                    values.Add(textBox.Name, textBox.Text);
                    break;
                case "ComboBox":
                    var comboBox = (ComboBox)control;
                    values.Add(comboBox.Name, comboBox.SelectedItem.ToString());
                    break;
                case "CheckBox":
                    var checkBox = (CheckBox)control;
                    values.Add(checkBox.Name, checkBox.Checked.ToString());
                    break;
                // TODO: Add additional cases to support other control types
            }
        }
        return values;
    }
    set
    {
        foreach (var control in Controls)
        {
            switch (control.GetType().Name)
            {
                case "TextBox":
                    var textBox = (TextBox)control;
                    textBox.Text = value[textBox.Name];
                    break;
                case "ComboBox":
                    var comboBox = (ComboBox)control;
                    comboBox.SelectedItem = value[comboBox.Name];
                    break;
                case "CheckBox":
                    var checkBox = (CheckBox)control;
                    checkBox.Checked = bool.Parse(value[checkBox.Name]);
                    break;
                // TODO: Add additional cases to support other control types
            }
        }
    }