.NET Dictionary Key作为ListBox DataSource

时间:2011-04-27 19:37:52

标签: .net windows data-binding collections listbox

我在winforms应用中使用了ListBox。我希望它将DataSource作为字典的键,所以我这样做:

IDictionary<Entity1, Entity2> myEntities = new Dictionary<Entity1, Entity2>();
myListBox.DataSource = myEntities.Keys;

所以我在第二行遇到以下错误:

  

复杂数据绑定在Ilist或IListSource

中作为数据源接受
  • 我尝试了两件不会做的事情:

    myListBox.DataSource =(IList&lt; Entity1&gt;)myEntities.Keys;

抛出InvalidCastException异常:

  

无法转换类型为&#39; KeyCollection [Entity1,Entity2]&#39;输入&#39; System.Collections.Generic.IList`1 [Entity1]&#39;。

  • 并且我也尝试过:

    myListBox.DataSource = myEntities.Keys.ToList&lt; Entity1&gt;();

但是这样我失去了绑定,当我修改myEntities时,myListBox.DataSource不会改变。

注意:除非消息由我翻译,因此它们可能与我写的完全不同。

有办法做到这一点吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

  myListBox.DataSource = (from keys in myEntities.Keys
                         select keys)
                         .ToList();

第三次魅力......

好,

我相信您必须继承Dictionary并覆盖.Add方法才能触发事件。在事件上,您将需要重新查询字典键。根据我发现的资源(包括:How to Bind...),当字典内容发生变化时,字典不会抛出事件。

答案 1 :(得分:1)

主要问题是您最终可以将字典键用作数据源,但是您没有办法通知DataSource您在字典中添加或删除了元素。

这是因为Dictionary没有任何通知事件,因此DataSource不知道字典的更改方式和时间。列表中已存在的项目仅仅因为DataSource保存对它们的引用而反映了它们的更改,因此当它们发生更改时,只要存在引用,就会显示更改。

为了触发词典中的更改,据我所知,您没有多少选择:

  • 每次添加或删除字典中的内容时,都要写一些代码将列表重新附加到DataSource(包括保留所选项目的所有问题等)。

  • 通过实施IBindingList或直接从BindingList派生来创建自己的数据结构。

它们都不是简单的解决方案,因此如果您的实体相对简单,您可能需要考虑一些替代方案,例如DataTables,它可以包含复杂的密钥和其他结构化数据。

答案 2 :(得分:0)

尝试使用

myListBox.DataSource = myEntities