Vb.net BindingSource更改后更新组合框下拉列表

Vb.net BindingSource更改后更新组合框下拉列表,vb.net,combobox,Vb.net,Combobox,我在网上浏览了大量的例子,但我找不到任何有效的(或者我做错了) 组合框像这样绑定到一个字典(String,String),而没有: cbBox.DataSource = New BindingSource(dictStrings.Keys, Nothing) 但是,在调用dictStrings.Add(s1,s2)后,组合框的下拉菜单不会列出新添加到dictStrings的值。我怎样才能解决这个问题?我曾尝试重新绑定数据源,但它只是将下拉菜单留空。我尝试使用ResetBindings()函数,

我在网上浏览了大量的例子,但我找不到任何有效的(或者我做错了)

组合框像这样绑定到一个字典(String,String),而没有:

cbBox.DataSource = New BindingSource(dictStrings.Keys, Nothing)

但是,在调用
dictStrings.Add(s1,s2)
后,组合框的下拉菜单不会列出新添加到
dictStrings
的值。我怎样才能解决这个问题?我曾尝试重新绑定
数据源
,但它只是将下拉菜单留空。我尝试使用
ResetBindings()
函数,但效果不佳。谢谢。

您尝试过cbBox.DataSource.refresh吗?

您尝试过cbBox.DataSource.refresh吗?

您可以创建一个新的绑定,但是您会丢失当前的索引位置,如果您已连接SelectedIndexChanged事件,则可能会启动一些意外的焰火,因此这将是一个解决方法:

Dim index As Integer = cbBox.SelectedIndex
RemoveHandler cbBox.SelectedIndexChanged, AddressOf cbBox_SelectedIndexChanged
dictStrings.Add("new key", "new value")
cbBox.DataSource = New BindingSource(dictStrings.Keys, Nothing)
cbBox.SelectedIndex = index
AddHandler cbBox.SelectedIndexChanged, AddressOf cbBox_SelectedIndexChanged

您可以创建一个新的绑定,但会丢失当前的索引位置,并且如果已连接SelectedIndexChanged事件,则可能会引发一些意外事件,因此这将是一个解决方法:

Dim index As Integer = cbBox.SelectedIndex
RemoveHandler cbBox.SelectedIndexChanged, AddressOf cbBox_SelectedIndexChanged
dictStrings.Add("new key", "new value")
cbBox.DataSource = New BindingSource(dictStrings.Keys, Nothing)
cbBox.SelectedIndex = index
AddHandler cbBox.SelectedIndexChanged, AddressOf cbBox_SelectedIndexChanged
应该解决这个问题

编辑:
cbBox.Update()

应该解决这个问题


编辑:
cbBox.Update()

我得到了这样的结果:类型为“BindingSource”的公共成员“Refresh”未找到没有这样的方法。我得到了这样的结果:类型为“BindingSource”的公共成员“Refresh”未找到没有这样的方法。使用
列表作为数据源也存在同样的问题-他们不监视内容的更改或提供通知。您可以使用
BindingList
代替列表,但对于字典,您需要编写一个自定义集合类,可能实现IDictionary并提供通知。
ObservableCollection(KeyValuePair(字符串的,字符串的))
可能会工作(尚未尝试)我检查了,从IDictionary和INotifyCollectionChanged构建的ObservableDictionary很酷,但它无助于解决这个问题-它需要IBindingList,这在以字典为基础的情况下不容易实现。使用
列表作为数据源也存在同样的问题-他们不关注内容的更改或提供通知。您可以使用
BindingList
代替列表,但对于字典,您需要编写一个自定义集合类,可能实现IDictionary并提供通知。一个
ObservaleCollection(KeyValuePair(String,String))
可能会工作(还没有尝试过)我检查过,一个从IDictionary和INotifyCollectionChanged构建的ObservalEdictionary很酷,但它不会帮助解决这个问题-它需要IBindingList,这在以字典为基础的情况下不容易实现。