数据绑定组合框清空列表<customobject> </customobject>

时间:2013-12-12 22:07:09

标签: c# winforms data-binding

我有一个有两个ComboBox的表单。我想使用第二个(子)ComboBox根据用户对第一个项目的选择来显示子对象列表。

当表单被实例化时,我将两个控件都数据绑定到私有List&lt; Widget&gt; s,如下所示:

private List<ParentWidget> _parentList;
private List<ChildWidget> _childList;

public FormExample()
{
    InitializeComponent();

    _parentList = GetParentWidgets();
    _childList = new List<ChildWidget>();

    cmbParent.DisplayMember = "WidgetName";
    cmbParent.ValueMember = "ID";
    cmbParent.DataSource = _parentList;

    cmbChild.DisplayMember = "WidgetName";
    cmbChild.ValueMember = "ID";
    cmbChild.DataSource = _childList;
}

当父选择的索引发生变化时,我会用适当的对象填充_childList

问题是子ComboBox从不显示集合中的任何对象。如果我在数据绑定之前用至少一个ChildWidget填充集合,它可以工作,但我希望它从空开始。

如果我从another answer正确理解,这是失败的,因为空列表不包含任何要绑定的属性。但是我绑定到特定的类(Widget)而不是通用对象。这对于数据绑定来说还不够吗?

2 个答案:

答案 0 :(得分:1)

使用绑定时,最好使用BindingList<>,问题是List<>不支持通知更改,因此当数据更改时,控件不知道并更新因此。您可以使用BindingList<>代替:

private BindingList<ParentWidget> _parentList;
private BindingList<ChildWidget> _childList;

这意味着您必须将方法GetParentWidgets()的返回类型更改为BindingList<ParentWidget>,或者您也可以使用BindingList<>的构造函数:

_parentList = new BindingList<ParentWidget>(GetParentWidgets());

答案 1 :(得分:0)

我要做的是听父组合框的valueChanged事件,当事件触发时我会对子组合进行数据绑定。

cmbParent.SelectedValueChanged += OnParentSelectedValueChanged;

private void OnParentSelectedValueChanged(object sender, EventArgs e)
{
    this.UpdateChildList(); // Update the data depending on the value in the parent combo

    cmbChild.DisplayMember = "WidgetName"; // I guess you can still do this in the constructor
    cmbChild.ValueMember = "ID"; // I guess you can still do this in the constructor

    cmbChild.DataSource = _childList;   
}