Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET字典键作为ListBox数据源_.net_Windows_Data Binding_Collections_Listbox - Fatal编程技术网

.NET字典键作为ListBox数据源

.NET字典键作为ListBox数据源,.net,windows,data-binding,collections,listbox,.net,Windows,Data Binding,Collections,Listbox,我的winforms应用程序中有一个列表框。我希望它具有字典的键作为数据源,因此我执行以下操作: IDictionary<Entity1, Entity2> myEntities = new Dictionary<Entity1, Entity2>(); myListBox.DataSource = myEntities.Keys; IDictionary myEntities=new Dictionary(); myListBox.DataSource=myEntit

我的winforms应用程序中有一个列表框。我希望它具有字典的键作为数据源,因此我执行以下操作:

IDictionary<Entity1, Entity2> myEntities = new Dictionary<Entity1, Entity2>();
myListBox.DataSource = myEntities.Keys;
IDictionary myEntities=new Dictionary();
myListBox.DataSource=myEntities.Keys;
所以我在第二行得到了以下错误:

复杂数据绑定接受Ilist或IListSource中的数据源

  • 我试过两件不会做的事:

    myListBox.DataSource=(IList)myEntities.Keys

引发InvalidCastException异常:

无法将“KeyCollection[Entity1,Entity2]”类型的对象转换为“System.Collections.Generic.IList`1[Entity1]”类型

  • 我也尝试过:

    myListBox.DataSource=myEntities.Keys.ToList()

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

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

有办法吗

谢谢

尝试使用

myListBox.DataSource = myEntities
第三次的魅力

好,


我相信您必须继承字典并重写.Add方法来触发事件。在事件中,您需要重新查询字典键。根据我找到的参考资料(包括:),字典在内容更改时不会抛出事件。

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

这是因为字典没有任何通知事件,因此数据源不知道字典是如何以及何时更改的。列表中已经存在的项反映了它们的更改,这仅仅是因为数据源保存了对它们的引用,因此当它们更改时,只要存在引用,更改都是可见的

就我所知,你没有太多的选择来改变你的字典:

  • 编写一些代码,以便在每次从字典中添加或删除某些内容时将列表重新附加到数据源(保留选定项等所有问题)

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


两个都不是简单的解决方案,所以如果您的实体相对简单,您可能需要考虑一些备选方案,例如:它可以保存一个复杂的键和其他结构化数据。

我只需要绑定字典的键。还抛出“复杂数据绑定接受Ilist或IListSource中的数据源”我必须启动VS并计算出来……我不记得我是需要.AsEnumerable还是.ToListOK。这是经过编译的,看起来很有效,但仍然有一点奇怪。当我修改myEntities上的一个元素时,DataSuce会按其应有的方式进行更改,但是当我从myEntities中添加或删除一个元素时,数据源似乎没有被绑定,有什么想法吗?
  myListBox.DataSource = (from keys in myEntities.Keys
                         select keys)
                         .ToList();