用字符串数组填充WPF列表框

5

不需要像这样逐一添加m_List字符串数组中的每个项到destinationList ListBox 中:

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

有没有更好的方法可以做到这一点?

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


3
除了字符串转换之外,如果绑定不是你的选择,我在上面的代码中没有发现任何问题。但我建议你将列表框绑定到你的集合(ObservableCollection会更好)。即使有比这更好的方法,它也最终会遍历你的集合。如果你经常使用它,你可以编写一个方法,并将你的列表作为参数传递进去。 - Amsakanna
我不想绑定它,因为我之后想要删除其中的几个项目。 - Archie
为什么您认为如果绑定了项目就无法删除它们? - Amsakanna
实际上,我尝试使用ItemsSource。我有一个带有复选框的树形视图,其选定的项目将进入destinationList。因此,在选中时应添加它,在取消选中时应删除它。所以如果我全部删除,然后再次尝试通过单击头节点添加,它会显示错误,因为在使用ItemsSource时操作无效。请改用ItemsControl.ItemsSource访问和修改元素。 - Archie
为此,您可以添加/删除项目或清除绑定到ListBox的整个ObservableCollection,而不是使用数组。 - Amsakanna
4个回答

7
如果您只是想更优雅地表达,那么也许这个方法会有效。
stringList.ForEach(item => listBox1.Items.Add(item));

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 as ObservableCollection)即可处理项目,而不是使用Items.Add等方法。

由于如果选中父复选框,则会调用所有子复选框的选中事件并抛出相同的错误,因此会出现错误。 除了添加单个项目作为Items.Add之外,还可以做什么? - Archie
抱歉,我不明白你的意思,父复选框?你能贴一些代码或更详细地描述你的问题吗? - Andrew
如果您将列表视图绑定到源代码,那么您必须使用源代码而不是列表视图项进行操作。至于您的问题,我需要查看会引发异常的代码。这种类型的异常通常发生在您不使用源代码而是使用项目进行操作时。至于复选框逻辑,取决于您(如果是在您的代码中),您可以更改复选框行为(我指的是树形视图),如果您不喜欢当前的行为方式。 - Andrew

0

好的..如果绑定不是一个选项 - 如果是,我可能会选择这种方式...那么填充列表框更有效的唯一方法就是并行执行。

(为了使其工作,我假设您已安装了.Net 4运行时或PLinq库)

以下代码将在多核机器上显示出巨大的改进,前提是数据集合足够大,以证明初始设置的开销。因此,这仅适用于较大的数组。

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

否则我看不出你的foreach循环有什么问题。


-1
使用ObservableCollection。

我该如何使用它?你的意思是用它代替字符串数组吗? - Archie
@Archie:如果你想保留原始内容,你需要将数组内容复制到ObservableCollection中,然后将OC绑定到ListBox。 - Amsakanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接