将对象添加到绑定列表时,组合框不更新

本文关键字:组合 更新 列表 对象 添加 绑定 | 更新日期: 2023-09-27 18:19:00

我有一个表示客户端的对象,该对象具有客户端分支的列表:

private List<Branch> _branches;
[System.Xml.Serialization.XmlArray("Branches"), System.Xml.Serialization.XmlArrayItem(typeof(Branch))]
public List<Branch> Branches
{
    get { return _branches; }
    set
    {
        _branches = value;
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs("Branches"));
        }
    }
}

在一个表单(WinForms(中,我有一个组合框,我已经绑定到该列表:

// creating a binding list for the branches
var bindingList = new BindingList<Branch>(Client.Branches);
// bind list to combo box
cmbBranches.DataSource = bindingList;
cmbBranches.DisplayMember = "Name";
cmbBranches.ValueMember = "Name";

在另一个函数中,我创建一个新的Branch对象并将其添加到现有列表中:Client.Branches.Add(newBranch) 。 我希望这会更新组合框,但它没有。 为什么不呢,如何更新它? (编辑:我也希望在从列表中删除对象时更新它。我认为它不起作用的原因与调用Add时该框不更新的原因直接相关。

在做研究时,我发现了这个 SO 答案,这似乎暗示它会起作用。 我觉得我错过了一些简单的东西...

ObservableCollection 和 BindingList 之间的区别

编辑:关于我尝试过的一些进一步的信息和一些额外的目标。

我不能使用 ObservableCollection<T> 而不是 List<T>,因为我需要在代码中使用Exists。前者没有。

除了更新下拉框外,我还需要在添加新对象时更新原始列表。

为了总结我在下面的评论,我试图添加以下内容:

var bindingList = (BindingList<Branch>) cmbBranches.DataSource;
bindingList.Add(frmAddBranch.NewBranch);

但这会导致对象被添加到组合框中两次。 不知何故,通过调用bindingList.Add它正在"重置"数据源并加倍。 我找不到任何在绑定后"刷新"数据显示的函数。 Control.ResetBindings()没有用。

将对象添加到绑定列表时,组合框不更新

好吧,它不是那样工作的。内部List<T>没有更改通知机制,因此直接添加到内部List<T>不会生成最终到达组合框的任何更改通知。执行所需操作的最便捷方法是改为通过BindingList<T>添加项目。

我相信您必须将项目直接添加到BindingList(但不是到支持Branches列表中 - BindingList应该为您处理这个问题(。