组合框上的C#数据绑定

时间:2009-08-25 09:28:50

标签: c# data-binding binding combobox

鉴于此代码,我无法理解以下2个问题。我将组合框映射到自定义对象,我希望每次组合框中所选值发生变化时,自定义对象也会发生变化。

public partial class MainForm : Form
{
    private Person _person;
    public MainForm()
    {
        InitializeComponent();
        _person = new Person();

        //Populating the combox, we have this.comboBoxCities.DataSource = this.cityBindingSource;
        cityBindingSource.Add(new City("London"));
        cityBindingSource.Add(new City("Paris"));
        _person.BirthCity = new City("Roma");
        cityBindingSource.Add(_person.BirthCity);
        cityBindingSource.Add(new City("Madrid"));

        //Doing the binding
        comboBoxCities.DataBindings.Add("SelectedItem", _person, "BirthCity");
    }

    private void buttonDisplay_Click(object sender, EventArgs e)
    {
        MessageBox.Show("BirthCity=" + _person.BirthCity.Name);
    }

    private int i = 0;
    private void buttonAddCity_Click(object sender, EventArgs e)
    {
        City city = new City("City n°" + i++);
        cityBindingSource.Add(city);
        comboBoxCities.SelectedItem = city;
    }

}

public class Person
{
    private City _birthCity;
    public City BirthCity
    {
        get { return _birthCity; }
        set
        {
            Console.WriteLine("Setting birthcity : " + value.Name);
            _birthCity = value;
        }
    }
}

public class City
{
    public string Name { get; set; }
    public City(string name) { Name = name; }
    public override string ToString() { return Name; }
}

1 - 为什么当我在组合框中手动选择连续两次(或更多)不同的值时,我只得到一次对BirthCity.Set的调用,而不是最后选择的值(并且只有在组合框失去了重点)?

2 - 为什么当我点击buttonAddCity然后再按buttonDisplay时,显示的城市不是所选择的城市(不是在组合框中显示的城市)

1 个答案:

答案 0 :(得分:2)

为什么当我在组合框中手动选择连续两次(或更多)不同的值时,我只得到一次对BirthCity.Set的调用,而不是最后选择的值(并且只有当组合框失去焦点时调用似乎才会触发) ?

这就是数据绑定的工作方式,在验证发生时数据从控件移动到属性,并在控件失去焦点时进行验证。

为什么当我点击buttonAddCity然后再按buttonDisplay时,显示的城市不是所选择的城市(不是在组合框中显示的那个)

我不知道。我创建了一个简单的表单(使用.Net 3.5 SP1的Visual C#Express 2008)并且几乎逐字地粘贴了您的代码,它按预期工作:它在组合框中显示新城市。

如果你添加comboBoxCities.Focus();在buttonAddCity_Click()的末尾,你将确保新城市被推入_person.BirthCity,而不是在ValidateChildren()上。