【问题标题】:How do I remove multiple selected items from a WPF ListView?如何从 WPF ListView 中删除多个选定项目?
【发布时间】:2019-02-15 09:53:13
【问题描述】:

我有一个 WPF ListView,其中包含许多项目。当我选择其中几个时,我希望能够通过一个按钮将它们删除。我遇到的问题是我可以从ListView 中删除一个项目,但是当我第二次迭代时,我得到一个:

收藏已修改;枚举操作可能无法执行。

由于上次删除修改了 ItemSourceListView 而出错。做这个的最好方式是什么?我尝试制作所选项目的副本,但我不知道要使用什么类型。

【问题讨论】:

    标签: wpf listview user-interface


    【解决方案1】:

    将所选项目的集合保存在不会更改的局部变量中,然后您可以毫无问题地对其进行迭代。

    例如

    var selected = lv.SelectedItems.Cast<Object>().ToArray();
    foreach (var item in selected) lv.Items.Remove(item); // or whereever you need to remove them...
    

    Cast&lt;T&gt;ToArrayextension methods

    【讨论】:

    • SelectedItems 没有 toArray() 方法。我似乎无法确定用于局部变量的类型。
    • ListView.SelectedItems 是 System.Collections.IList,因此没有 ToArray 方法。但你可以写: var selected = new ArrayList(listBox.SelectedItems);
    • @PetrakovichJ: ToArray 是一个 LINQ extension method,你需要为 System.Linq 提供一个 using
    • 这样的时刻让我觉得 C# 是一门糟糕的语言。不要误会我的意思,我喜欢它,但它有时会对我造成相当的辱骂。
    【解决方案2】:

    您可以管理要删除的索引列表,然后删除范围。

    ListView 绑定的集合源类型是什么?

    【讨论】:

    • 它是一个 ObservableColletion
    • 这个答案是最正确的——你需要通过它绑定的集合来管理 Listview。否则你会得到一个例外
    【解决方案3】:

    我首选的方法是使用调度程序:

    System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() =>
             {
                 my_Collection.Remove(item);
             }));
    

    【讨论】:

    • 是的,这将异步删除一项。问题是关于如何删除其中的几个。希望您不会一一异步地执行此操作。
    【解决方案4】:

    如果您的 ListView 绑定到自定义引用类型的集合,我认为这是首选且最简单的方法

    YorCustomType[] selected = new YorCustomType[YourListView.SelectedItems.Count];
    YourListView.SelectedItems.CopyTo(selected, 0);
    foreach (YorCustomType reference in selected)
    {
        YourSourceCollections.Remove(reference);
    }
    

    这不依赖于 Linq

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2014-10-29
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多