ComboBox не обновляется, когда объект добавляется в связанный список

У меня есть объект, представляющий клиента, и этот объект имеет список ветвей клиентов:

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, который, похоже, подразумевает, что он будет работать. Я чувствую, что упускаю что-то простое...

разница между ObservableCollection и BindingList

Изменить: дополнительная информация о том, что я пробовал, и некоторые дополнительные цели.

Я не могу использовать ObservableCollection<T> вместо List<T>, так как мне нужно использовать Exists в коде. Чего нет у первого.

Мне нужно обновить исходный список при добавлении нового объекта в дополнение к обновлению раскрывающегося списка.

Подводя итог моим комментариям ниже, я попытался добавить это:

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

Но это приводит к тому, что объект дважды добавляется в ComboBox. Каким-то образом, вызывая bindingList.Add, он «сбрасывает» источник данных и удваивается. Я не могу найти какую-либо функцию, которая «обновляет» отображение данных после его привязки. Control.ResetBindings() не получилось.


person Nathan Loding    schedule 18.06.2013    source источник
comment
посмотрите, поможет ли это stackoverflow.com/questions/13575397/   -  person Mo Patel    schedule 18.06.2013
comment
Подождите, значит, мне нужно добавить члена в bindingList? В этом есть смысл ...   -  person Nathan Loding    schedule 18.06.2013
comment
@MPatel - я добавил этот код, и теперь новый объект дважды появляется в ComboList! var bindingList = (BindingList<Branch>) cmbBranches.DataSource; bindingList.Add(frmAddBranch.NewBranch);   -  person Nathan Loding    schedule 18.06.2013


Ответы (2)


Ну, это так не работает. Внутренний List<T> не имеет механизма уведомления об изменениях, поэтому добавление непосредственно во внутренний List<T> не приведет к созданию уведомления об изменении, которое в конечном итоге попадет в поле со списком. Самый удобный способ сделать то, что вы хотите, — добавить элемент через BindingList<T> вместо этого.

person tia    schedule 18.06.2013
comment
См. мой последний комментарий к MPatel выше... что приводит к тому, что объект дважды добавляется в ComboBox. - person Nathan Loding; 18.06.2013
comment
Вы забыли удалить свой старый Client.Branches.Add(newBranch)? - person tia; 18.06.2013
comment
Если вам нужно добавить базовый List<T>, вы можете вызвать BindingList<T>.ResetBindings позже, чтобы принудительно обновить. - person tia; 19.06.2013
comment
звонок BindingList<T>.ResetBindings() был уловкой. Я пытался вызвать ResetBindings() в ComboBox, а не в списке привязок. Исправлено, спасибо! - person Nathan Loding; 19.06.2013

Я считаю, что вы должны добавлять элементы непосредственно в BindingList (но не в резервный список Branches - BindingList должен позаботиться об этом за вас).

person Oren    schedule 18.06.2013