Winforms绑定ComboBox的SelectedItem到一个对象属性

6

我有两个简单的类:

public class Customer
{
    public String CustomerID { get; set; }
    public String Forename { get; set; }
    public String Surname { get; set; }
}

并且

public class Order
{
    public String OrderID { get; set; }
    public Decimal Value { get; set; }
    public Customer OrderedBy { get; set; }
}

我现在创建了一个客户对象列表:
List<Customer> customers = new List<Customer>();
customers.Add(new Customer() { CustomerID = "1", Forename = "John", Surname = "Smith"});
customers.Add(new Customer() { CustomerID = "2", Forename = "Jeremy", Surname = "Smith" });

我有一个组合框,将数据源设置为我的客户列表,并将DisplayMember设置为客户对象的Forename属性:

comboBox1.DisplayMember = "Forename";
comboBox1.DataSource = customers;

结果是一个有两项“John”和“Jeremy”的组合框,到目前为止我不太困惑。

但是,我想要做的是根据从Combobox选择设置Order实例的“OrderedBy”属性 - 复杂类型可以像这样绑定到ComboBox吗?

我已经尝试过了,但似乎没有更新Order实例的OrderedBy属性:

Order myOrder = new Order();
comboBox1.DataBindings.Add("SelectedItem", myOrder, "OrderedBy");

我不知道我想做的事情是否可行,或者它是否超出了WinForms中数据绑定的能力范围。

如果可能的话,我想避免在ComboBox的事件处理程序上更新我的Order对象,并仅使用数据绑定。

1个回答

13

你的代码将会更新绑定对象的一个属性,但只有在ComboBox失去焦点之后才会更新。

如果你想要在SelectedItem改变后立即更新属性,最快的方法是手动发送关于更改的消息。
ComboBox中,当SelectedItem改变时,它会触发SelectionChangesCommitted事件。

你可以创建一个事件处理程序来处理更改并手动调用绑定:

private void combobox1_SelectionChangesCommitted(Object sender, EventArgs e)
{
    ((ComboBox)sender).DataBindings["SelectedItem"].WriteValue();
}

你也可以使用 ComboBox.ValueMember 属性,并将你的对象属性绑定到 SelectedValue


谢谢Fabio,这很有帮助! - suffolkml
确实非常有用! - Jack Griffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接