简体   繁体   中英

ComboBox items not updating when underlying ObservableCollection changes

I have a ComboBox and an ObservableCollection set as DataSource for that ComboBox .
When I programmatically add/remove items from the observable collection, nothing changes in the ComboBox .
What am I doing wrong?
Part 2: tried to put a BindingSource as a proxy for ObservableCollection . When programmatically added/removed items from ObservableCollection , no event like ListChanged or similar fired.
How can I make a ComboBox automatically update its list when underlying collection changes?

    public Form1()
    {
        InitializeComponent();

        comboBox1.DataSource = new ObservableCollection<MyItem>(
            new []
            {
                new MyItem() { Name = "AAA"},
                new MyItem() { Name = "BBB"},
            });
    }

    private void Button3_Click(object sender, EventArgs e)
    {
        // Nothing changes in the ComboBox when I add a new item to ObservableCollection
        ((ObservableCollection<MyItem>)(comboBox1.DataSource))
            .Add(new MyItem() { Name = Guid.NewGuid().ToString()});
    }
}

public class MyItem
{
    public string Name { get; set; }
}

It helps to wrap a list in a BindingList<T> . Here a little test code:

public partial class Form1 : Form
{
    private readonly List<string> _coll = new List<string> { "aaaaa", "bbbbb", "ccccc" };
    private readonly BindingList<string> _blist;
    private readonly Random _rand = new Random();
    private const string Templ = "mcvnoqei4yutladfffvtymoiaro875b247ytmlarkfhsdmptiuo58y1toye";

    public Form1()
    {
        InitializeComponent();
        _blist = new BindingList<string>(_coll);
        comboBox1.DataSource = _blist;
    }

    private void AddButton_Click(object sender, EventArgs e)
    {
        int i = _rand.Next(Templ.Length - 5);
        string s = Templ.Substring(i, 5);
        _blist.Add(s);
    }
}

Note that you have to make the changes (Add, Remove etc.) to the BindingList . The BindingSource works the same way.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM