【问题标题】:Binding a Winform to a Dictionary or Key/Value List将 Winform 绑定到字典或键/值列表
【发布时间】:2012-04-07 16:09:17
【问题描述】:
我有一个 Winforms 应用程序,它动态实例化外部表单对象以在配置 UI 中使用。每个动态实例化的表单都放在一个 TabPage 中。
我想创建一个接受字典或键/值列表的属性,并使用这些值填充表单,将控件的值与字典中键的值匹配。相反,该属性也会返回一个 Key/Value 列表,该列表对应于 Winform 中控件的值。
这是一个简单的绑定问题,还是我需要编写自定义代码?这段代码会是什么样子?
过去,我通过编写DTO 类、使用XML 序列化和反序列化来持久化类的数据并将表单字段连接到DTO 对象的字段来实现这一点。问题是,由于表单是从外部 DLL 动态实例化的,因此无法静态“引用”这个 DTO 类,所以我正在寻找一种更动态的方法。
【问题讨论】:
标签:
c#
winforms
data-binding
.net-3.5
data-persistence
【解决方案1】:
结果比我想象的要容易。
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
}
}
}