使用 BindgSource 反映对 DataSource 的控制更改
Reflect control changes to DataSource using BindgSource
我正在使用 WinFroms 并尝试使用 BindingSource 将控件(ComboBox)更改反映到 DataSource。其实我想看看在组合框中选择了什么项目。
我的模型是:
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(不使用组合框的更改事件)。
我不知道该怎么做。可能吗?
您代码中的主要问题是您将数据绑定设置为列表的 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));
我正在使用 WinFroms 并尝试使用 BindingSource 将控件(ComboBox)更改反映到 DataSource。其实我想看看在组合框中选择了什么项目。
我的模型是:
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(不使用组合框的更改事件)。
我不知道该怎么做。可能吗?
您代码中的主要问题是您将数据绑定设置为列表的 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));