出于某种原因,当从DataSource(一个简单的BindingList)中添加或删除项目时,ComboBox会相应地更新,但如果我像这样编辑一个项目,它不会自动更新:
myBindingList[index].Name = "NewName";
myBindingList[index].Value = newValue;
为了让它在我编辑一个项目时更新,而不是创建或删除一个项目,我必须在更改后这样做:
myComboBox.DataSource = null;
myComboBox.DataSource = myBindingList;
这解决了问题,但它似乎是一个相当混乱的解决方案。同样,对于大列表,它可能会变得很慢(我知道过早的优化),但仍然有一种方法可以强制ComboBox更新而不完全重新分配其数据源?
感谢阅读。
3条答案
按热度按时间mwngjboj1#
在MSDN论坛中有这样的说法:
IBindingList接口包含ListChanged事件,如果分配给它的底层数据源实现了上述接口,那么combobox这样的控件将挂接到该事件中。如果你添加、删除、更改等,你的数据源必须用正确的ListChangeEventArgs引发相应的ListChanged。您的IBindingList实现程序。这样,每当用于绑定到组合框的基础源代码发生更改时,相应的UI控件(组合框)就会刷新。
你说你正在使用BindingList,事实上你确实得到了combobox来反映添加或删除条目事件。我认为你应该用另一种方式更新BindingList中已经存在的项目,因为看起来像是正确的BindingList事件没有触发。
你可以调查一下,或者简单地接受重置并重新分配数据源,我不认为这太糟糕,你是在Stateful Windows Forms应用程序中,而不是在SatetLess WebForms中,所以你总是有你的对象:)
2admgd592#
您需要可观察的集合和IPropertyChange实现:
ComboBox bound to a ObservableCollection does not update
guz6ccqo3#
我也遇到过类似的问题,因为对象没有被渲染,所以组合框不会填充它的选项列表。导致第一个示例运行时出现“索引无效”错误。我通过在设置索引之前显示控件来解决这个问题。
进入: