如何从Observable Collection中移除项目

3

抱歉,我写了一篇小说,但我想解释一下目前为止我所做的事情。

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

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

从我所了解的来看,在可观察集合中没有枚举/索引的方法。对于这种情况,您应该使用List或Array。但是,为了使项目在列表视图中刷新,它们需要在可观察集合中。

根据我所读的,似乎当事件被触发时,我需要将可观察集合转换为数组,然后评估数组以确定索引,然后相应地删除记录?

我认为我可能偏离了正道,因为似乎我正在对这个问题进行过度设计?上述情况似乎不正确,因为我觉得我在不停地将集合转换来转换去,只是为了删除一条记录?是否有人知道以任意顺序从集合中高效地删除记录(当集合作为列表框中的项控件呈现时)的方法?我已成功使用RemoveAt()删除了添加到集合中的最后一条记录,但是我在随机删除记录方面没有取得任何成功。

事后想法:这个问题的一部分可能与事实有关,即我在数据模板(控件项)中插入了一个按钮,因此在按钮事件触发之前,该项实际上并未被选择?对于这个问题,我很抱歉,因为我花了数小时才解决,并取得了一些进展。如果您有任何提示或想法,将不胜感激!


3
这个问题太冗长了。如果你能简化成一个实际的问题,那么你会做得很好。另外,我不知道你在哪里看到不能对ObservableCollection进行索引或枚举。当然可以,它具有所有ICollection<T>方法(IndexOf、Item索引器等)。 - Adam Sills
谢谢Adam,对不起让你看了这么长的问题描述。我试图给出一个过于详细的问题,结果变得更加混乱而不是简明扼要。再次感谢你在ICollection方面的建议。 - rlcrews
1个回答

5

ObservableCollection<T>继承自Collection<T>,它实现了IList<T>,因此您可以对其进行索引和枚举。它有一个Remove方法,该方法接受要删除的对象并从集合中删除第一个出现的对象,还有一个RemoveAt方法,该方法接受一个索引并删除该索引处的项。

根据您的想法,听起来您有一个带有ItemTemplate的WPF ListBox,该模板创建一个Button。ListBox将每个实例化模板的DataContext设置为绑定到的列表中的项,因此您可以通过按钮上的DataContext属性或使用绑定从DataContext属性获取创建Button的项的引用。


谢谢Quarermeister。经过一些额外的研究,我回去重新制作了模板,并从模板中删除了按钮。这使我能够使用控件的SelectedItem,并将按钮移动到列表下方。虽然在视觉上有点不同,但它可以正常工作,没有问题。感谢您的提示。 - rlcrews

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