2014-01-08 59 views
1

我试图用枚举值初始化BindingList。 根据MSDN BindingList有一个构造函数接受IList作为参数。
我当前的代码工作,但似乎有些“笨拙”:使用枚举值初始化BindingList

list = new BindingList<Option>(); 
foreach (Option o in Enum.GetValues(typeof(Option))) 
{ 
    list.Add(o); 
} 

我试图使用此代码来代替:

list = new BindingList<Option>(Enum.GetValues(typeof(Option))); 

,但它给了我一个错误说它有无效的参数,即使Enum.GetValues的返回类型是Array,它实现了IList。
如果这个构造函数实质上做我做的同样的事情,我仍然更喜欢使用构造函数来提高可读性。

如果有人能指出我使用此构造函数以供将来使用的正确方法,我很乐意。根据您的评论

var list = new BindingList<Option>(Enum.GetValues(typeof(Option)) as IList<Option>); 

编辑:

回答

0

这应该为你工作

虽然我不知道为什么,你为什么会想添加或枚举值的列表中删除,你可以这样做:

var list = new List<Option>(Enum.GetValues(typeof(Option)) as IEnumerable<Option>); 
/* Add anything you want to 'list' here */ 
var blist = new BindingList<Option>(list as IList<Option>); 
/* blist is not readonly any more, so add or remove whatever you want */ 

它是只读的原因是因为BindingList克隆了枚举中的值。考虑到你不能添加或从枚举中删除值,Enum.GetValues()中的数组以及随后传递到BindingList的构造函数的IList是只读的。因为BindingList接受IList作为起始值,而不仅仅是一个IEnumberable源,所以IList的所有属性也被克隆到BindingList中,而不仅仅是这些值本身。

希望澄清为什么列表是只读的。虽然,您可能想重新考虑为什么需要添加到枚举值列表。

+0

这种方式初始化列表工作,谢谢。但遗憾的是,如果我以这种方式初始化它,它就是只读的。 –

+0

@ DennisE。看到我修改后的答案。希望能帮助到你。 – astallaslions

+0

得到它的工作,谢谢!添加枚举值列表用于为应用程序实现可重新排列的用户界面(因此,如果需要,我可以稍后在枚举中添加另一个UI部件)。 –