2011-04-27 14 views
1

我已经在我的WinForms应用程序的列表框。我希望它有作为数据源字典的键,以便我做如下:.NET词典按键作为数据源列表框

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

所以我得到的第二线以下错误:

Complex databinding accepts as a datasource either in Ilist or IListSource

  • 我已经尝试了两件不会做的事情:

    myListBox.DataSource =(IList < Entity1>)myEntities.Keys;

引发InvalidCastException异常:

Can't convert an object of type 'KeyCollection[Entity1,Entity2]' to type 'System.Collections.Generic.IList`1[Entity1]'.

  • AND和我也试着:

    myListBox.DataSource = myEntities.Keys.ToList < ENTITY1>();

但这样,我失去了约束力,当我修改myEntitiesmyListBox.DataSource不会改变。

注意: excepton消息由我翻译,所以他们可能不完全按照我写的。

没有办法做到做到这一点?

谢谢!

回答

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

第三次魅力。

好吧,

我相信你将不得不继承词典和覆盖。新增的方法来触发尝试一个事件。在事件中,您将需要重新查询字典键。根据资源,我发现(包括:How to Bind...)的词典不会引发事件时,它的内容发生变化。

+0

同样抛出'复杂数据绑定接受作为数据源在Ilist或IListSource' – Diego 2011-04-27 19:41:49

+0

仍然是一个例外。 – Diego 2011-04-27 19:51:05

+0

我不得不启动我的VS并将其解决......我不记得是否需要.AsEnumerable或.ToList – IAbstract 2011-04-27 19:52:38

0

使用

myListBox.DataSource = myEntities 
+0

我只需要绑定字典的键。 – Diego 2011-04-27 19:41:25

1

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

这是因为字典没有任何通知的情况下为,因此数据源不知道如何和何时你的字典里发生了变化。已经存在于清单中的项目得到了他们的变化反映仅仅是因为数据源保持对它们的引用,所以当他们改变的变化是显而易见的,只要有保持的参照。

用于触发您的字典的改变,因为据我所知,你没有太多的选择:

  • 写一些代码,每次重新连接列表中的数据源添加或删除的东西从所有的问题保留选定的项目等

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

两人都没有容易的解决办法,因此,如果您的实体都比较简单,你可能要考虑一些替代品,如DataTables,可以存放复杂的密钥和其他结构化数据。

+0

感谢您的答案。我必须考虑要做什么。 – Diego 2011-04-27 21:30:00