Question

I have an object that represents a client, and that object has a list of the clients branches:

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"));
        }
    }
}

In one form (WinForms) I have a ComboBox that I've bound to that list:

// 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";

In another function, I create a new Branch object and add it to the existing list: Client.Branches.Add(newBranch). I would expect this to update the ComboBox but it doesn't. Why not, and how do I make it update? (Edit: I'd also like this to update when removing an object from the list. The reason it doesn't work is, I assume, directly related to why the box isn't updating when Add is called.)

In doing research, I found this SO answer, which seems to imply that it will work. I feel like I'm missing something simple ...

difference between ObservableCollection and BindingList

Edit: Some further information about what I've tried and some additional goals.

I cannot use ObservableCollection<T> instead of List<T> as I need to use Exists in the code. Which the former doesn't have.

I need to update the original list when the new object is added, in addition to updating the drop down box.

To summarize my comments below, I attempted adding this:

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

But that results in the object being added to the ComboBox twice. Somehow by calling bindingList.Add it's "resetting" the data source and doubling up. I cannot find any function that "refreshes" the data display once it's bound. Control.ResetBindings() did not work.

Was it helpful?

Solution

Well, it doesn't work that way. The inner List<T> has no change notification mechanism, so adding directly to inner List<T> will not generate any change notification that would eventually reach the combo box. Most convenient way to do what you want is adding the item through the BindingList<T> instead.

OTHER TIPS

I believe you have to add the items directly to the BindingList (but not to the backing Branches list - the BindingList should take care of this for you).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top