使用BindgSource反映对DataSource的控制更改

时间:2016-03-14 05:45:25

标签: c# winforms data-binding combobox bindingsource

我正在使用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的更改事件)。

我无法弄清楚如何做到这一点。有可能吗?

1 个答案:

答案 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));