【问题标题】:Fill WPF listbox with string array用字符串数组填充 WPF 列表框
【发布时间】:2011-06-14 18:08:11
【问题描述】:

而不是像这样将字符串数组m_List中的每一项添加到ListBox destinationList中:

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

有没有更好的办法?

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

【问题讨论】:

  • 除了字符串转换之外,如果绑定不是您的选择,我在上面的代码中没有发现任何不好的地方。但我建议您将列表框绑定到您的收藏(ObservableCollection 会更好)。即使有比这更好的东西,它最终也会遍历你的集合。如果您要经常使用它,您可以为此编写一个方法,将您的列表作为参数发送。
  • 我不想绑定它,因为我想稍后从中删除一些项目。
  • 为什么你认为你不能删除绑定的项目?
  • 其实我试过使用ItemsSource。我有一个带有复选框的树视图,其所选项目将进入destinationList。所以在选中它应该被添加并且在未选中它应该被删除。因此,如果我删除所有并再次尝试通过单击头节点添加它会显示错误,因为在使用 ItemsSource 时操作无效。改为使用 ItemsControl.ItemsSource 访问和修改元素。
  • 为此,您可以添加/删除项目或清除绑定到 ListBox 的整个 ObservableCollection,而不是使用数组。

标签: c# wpf listbox


【解决方案1】:

如果你只想更优雅地表达它,那么也许这会奏效。

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

【讨论】:

    【解决方案2】:

    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 可以做什么?
    • 对不起,我不明白你,家长复选框?您可以发布一些代码,或者更详细地描述您的问题吗?
    • 如果将 listview 绑定到源,则必须使用源,而不是使用 listviewitems。至于您的问题,我必须查看引发异常的代码。如果您不使用源而是使用项目,通常会发生这种异常。至于复选框逻辑,这取决于您(如果它在您的代码中),如果您不喜欢它,您可以更改检查行为(我说的是树视图)。
    【解决方案3】:

    使用 OberservableCollection

    【讨论】:

    • 我该如何使用它?你的意思是不是字符串数组?
    • @Archie:如果要保留原始内容,则必须将数组内容复制到 ObservableCollection 中,然后将 OC 绑定到 ListBox。
    【解决方案4】:

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

    (为此,我假设您安装了 .Net 4 运行时或 PLinq 库)

    如果数据集合足够大以保证初始设置的开销,则以下代码将显示多核机器的巨大改进。所以这只适用于更大的数组。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 2019-06-05
      相关资源
      最近更新 更多