2010-04-29 69 views
3

而不是将每个项目一个列表框destinationList从字符串数组m_List这样的:一个填充WPF列表框与字符串数组

foreach (object name in m_List) 
{ 
    destinationList.Items.Add((string)name); 
} 

有没有什么更好的办法我能做到吗?

我不想将数据绑定到destinationList,因为我想稍后从列表框中删除一些条目。

+3

除了字符串铸造,如果绑定是不是你的选择我不觉得在上面的代码什么坏事。但我会建议你将列表框绑定到你的集合(ObservableCollection会更好)。即使有比这更好的东西,它会最终通过你的收藏迭代。如果你打算经常使用它,你可以为它写一个方法,把你的列表作为参数发送。 – Amsakanna 2010-04-29 11:58:10

+0

我不想绑定它,因为我想稍后从中删除几件物品。 – Archie 2010-04-29 12:00:32

+0

为什么你认为你不能删除物品,如果他们绑定? – Amsakanna 2010-04-29 12:03:21

回答

5

HTH:

string[] list = new string[] { "1", "2", "3" }; 

    ObservableCollection<string> oList; 
    oList = new System.Collections.ObjectModel.ObservableCollection<string>(list); 
    listBox1.DataContext = oList; 

    Binding binding = new Binding(); 
    listBox1.SetBinding(ListBox.ItemsSourceProperty, binding); 

    (listBox1.ItemsSource as ObservableCollection<string>).RemoveAt(0); 

只要使用(如的ItemSource的ObservableCollection)......与项目合作,而不是Items.Add等

+0

它给出了错误,因为如果父复选框被选中,所有的子复选框的选中的事件被调用并且抛出相同的错误。 而不是添加一个项目作为Items.Add可以做什么? – Archie 2010-04-30 10:33:21

+0

对不起,但我不明白你,父母复选框?你可以发布一些代码,或者用更多的细节来描述你的问题吗? – Andrew 2010-04-30 10:45:57

+0

Plz阅读问题中的意见以进行澄清。 – Archie 2010-05-04 06:25:23

0

使用OberservableCollection

+0

我该如何使用它?你的意思,而不是字符串数组? – Archie 2010-04-29 12:04:14

+0

@Archie:如果要保留原始内容,您必须将数组内容复制到ObservableCollection中,然后将OC绑定到ListBox。 – Amsakanna 2010-04-29 12:08:01

0

好吧..如果结合不是一种选择 - 如果是这样的话,我可能会这样......然后填充列表框的唯一更有效的方法是并行执行。

(对于这个工作我假设你有.net 4运行时,或安装在PLINQ库)

下面的代码会显示在多核机器上大量的改进,提供的数据收集足够大保证初始设置的开销。所以这只适用于较大的阵列。

Parallel.ForEach(list, r => destinationList.Items.Add(r)); 

否则我没有看到你的foreach循环有什么问题。

5

如果你只想表达它更优雅,那么也许这将工作。

stringList.ForEach(item => listBox1.Items.Add(item)); 
+0

这是美丽的 – ohmusama 2013-10-18 17:34:36