基础ObservableCollection更改时,ComboBox项未更新

时间:2019-06-25 20:35:41

标签: c# winforms

我有一个ComboBox和一个ObservableCollection设置为DataSource的一个ComboBox
当我以编程方式从可观察的集合中添加/删除项目时,ComboBox中没有任何变化。
我在做什么错了?
第2部分:尝试将BindingSource用作ObservableCollection的代理。以编程方式从ObservableCollection添加/删除项目时,不会触发类似ListChanged或类似事件的事件。
基础集合更改时,如何使ComboBox自动更新其列表?

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

1 个答案:

答案 0 :(得分:1)

这有助于将列表包装在BindingList<T>中。这里是一些测试代码:

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

请注意,您必须对BindingList进行更改(添加,删除等)。 BindingSource的工作方式相同。