【问题标题】:Winforms Binding a ComboBox SelectedItem to an Object PropertyWinforms 将 ComboBox SelectedItem 绑定到对象属性
【发布时间】:2015-09-29 08:47:57
【问题描述】:

我有两个简单的类:

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”。到目前为止,我并没有太困惑。

不过,我希望能够根据从组合框中的选择设置 Order 实例的“OrderedBy”属性 - 复杂类型可以像这样绑定到组合框吗?

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

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

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

我希望避免将我的 Order 对象作为 ComboBox 上的事件处理程序的一部分进行更新,并尽可能仅使用数据绑定。

【问题讨论】:

    标签: c# winforms data-binding combobox


    【解决方案1】:

    您的代码将更新有界对象的属性,但仅在 ComboBox 失去焦点之后。

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

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

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

    您还可以使用ComboBox.ValueMember 属性并将您的对象属性绑定到SelectedValue

    【讨论】:

    • 感谢法比奥,帮了大忙!
    • 确实很有用!
    猜你喜欢
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2021-02-15
    • 1970-01-01
    • 2014-12-08
    • 2019-06-03
    相关资源
    最近更新 更多