使用 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 的所有项目。

在第二行,你说绑定组合的SelectedItemModel1.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));