0

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

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)中,我有一个绑定到该列表的 ComboBox:

// 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). 我希望这会更新 ComboBox,但事实并非如此。为什么不,我该如何更新?(编辑:我也希望在从列表中删除对象时更新它。我认为它不起作用的原因是与Add调用时框不更新的原因直接相关。)

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

ObservableCollection 和 BindingList 的区别

编辑:有关我尝试过的内容和一些其他目标的更多信息。

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

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

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

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

但这会导致对象被两次添加到 ComboBox 中。不知何故,称之为bindingList.Add“重置”数据源并加倍。一旦绑定,我找不到任何“刷新”数据显示的功能。 Control.ResetBindings()不工作。

4

2 回答 2

1

好吧,它不是那样工作的。innerList<T>没有更改通知机制,因此直接添加到 innerList<T>不会生成任何最终到达组合框的更改通知。做你想做的最方便的方法是通过添加项目BindingList<T>

于 2013-06-18T18:24:24.103 回答
0

我相信您必须将项目直接添加到BindingList(而不是支持Branches列表 -BindingList应该为您处理)。

于 2013-06-18T18:27:33.743 回答