【问题标题】:How to remove items from an Observable Collection如何从 Observable 集合中删除项目
【发布时间】:2010-06-30 02:02:53
【问题描述】:

我为这部小说道歉,但我想解释到目前为止我所做的一切。

在我当前的项目中,我有一个使用服务的应用程序,该服务以<List> 的形式提供集合。由于我在应用程序中使用这些数据的方式,我不得不将这些数据转换为可观察的集合。这样做是为了在选择和移动数据时使用 INotifyPropertyChanged 和 INotifyCollectionChanged 刷新应用程序 UI 更新。

我现在面临的挑战是我有一个列表框,它绑定到列表框中的可观察集合我有一个数据模板,它呈现出集合的项目。此数据模板包含一个按钮,该按钮需要允许用户单击每个项目的按钮以将其从集合中删除。 用例是一个列表框,用于存储从网格视图中选择的名称。一旦用户从 gridview 中选择了名称,它们就会被存储(在可观察集合中作为队列)并在 UI 中呈现在一个列表框控件中,该控件显示所有选定的名称。我需要为用户提供以任何选择的顺序删除这些名称的能力。

从我一直在阅读的内容来看,没有办法枚举/索引可观察的集合。对于这种情况,您应该使用 List 或 Array。然而,为了让项目在列表视图中刷新,它们需要位于可观察集合中。 从我读过的内容来看,当事件被触发时,我需要将可观察集合转换为数组,然后评估数组以确定索引,然后相应地删除记录?

我想我可能会偏离这个基础,因为我似乎过度设计了这个问题?上述情况似乎不正确是因为我跌倒了,好像我正在做很多与收藏品之间的转换来删除一条记录? 当集合呈现为列表框中的项目控件时,有谁知道从集合中删除记录的有效方法(以任何选择的顺序)? 我已经成功地使用 RemoveAt() 删除了添加到集合中的最后一条记录,但是我在随机删除记录方面没有任何成功。

事后思考:这个问题的一部分可能与我在数据模板(控制项)中插入了一个按钮有关,因此在事件发生之前该项目实际上没有被选中触发按钮事件? 很抱歉对此漫无边际,但我已经为此思考了几个小时并取得了微小的进展。任何提示或想法将不胜感激!

【问题讨论】:

  • 这个问题太啰嗦了。如果你能减少一个实际的问题,你会做到公正。仅供参考,我不知道你在哪里读到你不能索引或枚举 ObservableCollection。当然可以,它拥有所有的ICollection<T> 方法(IndexOf、Item 索引器等)。
  • 感谢亚当,对这部长篇小说感到抱歉。我试图提出一个过于描述性的问题,但结果却更加简洁。再次感谢有关 ICollection 的提示

标签: wpf collections observablecollection


【解决方案1】:

ObservableCollection<T> 继承自实现IList<T>Collection<T>,因此您当然可以对其进行索引和枚举。它有一个 Remove 方法,用于移除对象并移除集合中的第一个匹配项,还有一个 RemoveAt 方法,它获取一个索引并移除该索引处的项目。

根据您事后的想法,听起来您有一个 WPF 列表框,其中包含一个创建按钮的 ItemTemplate。 ListBox 会将每个实例化模板的 DataContext 设置为要绑定到的列表中的项,因此您可以从 Button 上的 DataContext 属性或使用 Binding 获取对创建 Button 的项的引用。

【讨论】:

  • 谢谢你Quarermeister。经过一些额外的研究,我回去重新设计了模板并从模板中删除了按钮。这使我可以使用控件中的 SelectedItem 并将按钮移动到列表下方。虽然视觉上有点不同。它可以正常工作。感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多