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

C# 将Winform绑定到字典或键/值列表,c#,winforms,data-binding,.net-3.5,data-persistence,C#,Winforms,Data Binding,.net 3.5,Data Persistence,我有一个Winforms应用程序,它动态实例化外部表单对象,以便在配置UI中使用。每个动态实例化的表单都放置在一个选项卡页中 我想创建一个属性,该属性将接受字典或键/值列表,并用这些值填充表单,将控件的值与字典中键的值匹配起来。相反,该属性还将返回与Winform中控件的值相对应的键/值列表 这是一个简单的绑定问题,还是需要编写自定义代码?那代码是什么样子的 在过去,我通过编写一个类来实现这一点,使用XML序列化和反序列化来持久化类的数据,并将表单字段连接到DTO对象的字段。问题是,由于表单是从

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

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

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


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

结果比我想象的要简单

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
            }
        }
    }
公共字典值
{
得到
{
var值=新字典();
foreach(控件中的var控件)
{
开关(control.GetType().Name)
{
案例“文本框”:
var textBox=(textBox)控件;
添加(textBox.Name,textBox.Text);
打破
案例“组合框”:
var comboBox=(comboBox)控件;
Add(comboBox.Name,comboBox.SelectedItem.ToString());
打破
案例“复选框”:
var checkBox=(checkBox)控件;
values.Add(checkBox.Name,checkBox.Checked.ToString());
打破
//TODO:添加其他案例以支持其他控件类型
}
}
返回值;
}
设置
{
foreach(控件中的var控件)
{
开关(control.GetType().Name)
{
案例“文本框”:
var textBox=(textBox)控件;
Text=value[textBox.Name];
打破
案例“组合框”:
var comboBox=(comboBox)控件;
comboBox.SelectedItem=value[comboBox.Name];
打破
案例“复选框”:
var checkBox=(checkBox)控件;
checkBox.Checked=bool.Parse(值[checkBox.Name]);
打破
//TODO:添加其他案例以支持其他控件类型
}
}
}

结果比我想象的要简单

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
            }
        }
    }
公共字典值
{
得到
{
var值=新字典();
foreach(控件中的var控件)
{
开关(control.GetType().Name)
{
案例“文本框”:
var textBox=(textBox)控件;
添加(textBox.Name,textBox.Text);
打破
案例“组合框”:
var comboBox=(comboBox)控件;
Add(comboBox.Name,comboBox.SelectedItem.ToString());
打破
案例“复选框”:
var checkBox=(checkBox)控件;
values.Add(checkBox.Name,checkBox.Checked.ToString());
打破
//TODO:添加其他案例以支持其他控件类型
}
}
返回值;
}
设置
{
foreach(控件中的var控件)
{
开关(control.GetType().Name)
{
案例“文本框”:
var textBox=(textBox)控件;
Text=value[textBox.Name];
打破
案例“组合框”:
var comboBox=(comboBox)控件;
comboBox.SelectedItem=value[comboBox.Name];
打破
案例“复选框”:
var checkBox=(checkBox)控件;
checkBox.Checked=bool.Parse(值[checkBox.Name]);
打破
//TODO:添加其他案例以支持其他控件类型
}
}
}

如果您有一个WPF应用程序,这将非常容易。如果您有一个WPF应用程序,这将非常容易。