绑定空Dictionary至ListBox显示异常:为何不显示空白?
绑定空Dictionary到ListBox显示"(Collection)",但空List却显示空白的原因
我通过BindingSource将Dictionary内容绑定到ListBox,这种方式对自定义集合同样适用。但发现一个差异:当集合为空时,ListBox不会显示空白,而是显示一行内容——Dictionary显示"(Collection)",自定义集合则显示类名(即Object.ToString()的默认结果)。
非空字典的正常绑定(显示两行内容)
Dim dic As New Dictionary(Of String, String) From {{"a", "b"}, {"c", "d"}} ListBox1.DataSource = New BindingSource(dic, Nothing)
空字典的异常情况(显示一行"(Collection)")
Dim dic As New Dictionary(Of String, String) ListBox1.DataSource = New BindingSource(dic, Nothing)
绑定空List的正常表现(显示空白)
ListBox1.DataSource = New List(Of String)()
示例图:
原因分析
这是BindingSource对不同集合类型的处理逻辑差异导致的:
List<T>实现了IList接口,BindingSource能直接识别它是可索引的列表集合。当集合为空时,BindingSource明确知道没有元素,因此ListBox显示空白。Dictionary<TKey,TValue>仅实现了ICollection和IDictionary接口,未实现IList或IListSource。当集合为空时,BindingSource无法将其识别为可枚举的列表项集合,转而把整个Dictionary对象作为单个数据项绑定,最终显示该对象ToString()的返回值——Dictionary的默认ToString()输出就是"(Collection)",自定义集合则会输出类的全名。
解决方法
要避免空Dictionary出现这种情况,可以参考以下方式:
- 判断集合状态,动态设置数据源
Dim dic As New Dictionary(Of String, String) If dic.Count = 0 Then ListBox1.DataSource = Nothing ' 或绑定空List Else ListBox1.DataSource = New BindingSource(dic, Nothing) End If - 绑定Dictionary的Keys/Values集合
绑定Keys或Values属性,空集合时ListBox会显示空白:Dim dic As New Dictionary(Of String, String) ListBox1.DataSource = New BindingSource(dic.Keys, Nothing) - 将Dictionary转换为List后绑定
利用List<T>的IList特性,确保空集合时显示空白:Dim dic As New Dictionary(Of String, String) Dim itemList = dic.ToList() ListBox1.DataSource = New BindingSource(itemList, Nothing)
内容的提问来源于stack exchange,提问作者Ropertto IV
相关产品推荐
相关产品推荐

