我正在使用WinFroms并尝试使用BindingSource将控件(ComboBox)更改反映到DataSource。 Actualy我想看看在comboBox中选择了什么项目。
我的模特是:
public class Foo
{
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
public class Bar
{
public List<Foo> Foos { get; set; }
public Foo SelectedFoo { get; set; }
}
结合:
List<Foo> lst = new List<Foo>();
lst.Add(new Foo{Name="Name1"});
lst.Add(new Foo{Name="Name2"});
Bar bar = new Bar { Foos = lst };
InitializeComponent();
// bSource - is a BindingSource on the form
this.bSource.DataSource = bar;
// cbBinds - is a ComboBox
this.cbBinds.DataSource = bar.Foos;
this.cbBinds.DataBindings.Add(new Binding("SelectedItem", this.bSource, "Foos", true));
此代码有效,所有Foos都在cbBinding中显示。但是我也希望在组合框中更改所选项目的时间。所以我希望Bar.SelectedFoo变得等于cbBinds.SelectedItem(不使用comboBox的更改事件)。
我无法弄清楚如何做到这一点。有可能吗?
答案 0 :(得分:2)
代码中的主要问题是您设置数据绑定到列表的Foos
属性,而您应该将数据绑定设置为SelectedFoo
。
使用以下代码设置数据绑定时:
comboBox1.DataSource = List1;
comboBox1.DataBindings.Add(new Binding("SelectedItem", Model1, "Property1", true));
在第一行,您说组合框显示List1
的所有项目。
在第二行中,您将组合SelectedItem
绑定到Model1.Property1
,这意味着当您更改所选的组合项时,Model1.Property1
将设置为所选的组合项。
所以你的代码应该是这样的:
this.comboBox1.DataBindings.Add(new Binding("SelectedItem", bs, "SelectedFoo", true));
注意强>
阅读以上说明。现在你知道使用BindingSource
不是强制性的,你也可以用这种方式编写代码:
this.comboBox1.DataSource = bar.Foos;
this.comboBox1.DataBindings.Add(new Binding("SelectedItem", bar, "SelectedFoo", true));