我在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
不会改变。
注意:除非消息由我翻译,因此它们可能与我写的完全不同。
有办法做到这一点吗?
谢谢!
答案 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