C# WPF:选择具有重复对象引用的编辑项

C# WPF:选择具有重复对象引用的编辑项,c#,wpf,listview,C#,Wpf,Listview,假设我有这些课程: public class Person { public string Name { get; set; } } public class PersonCollection : ObservableCollection<Person> { } 现在我有了一个包含三项的ListView,其中所有三项都是对同一对象的引用。现在我在ListView中选择索引为0和2的项 ListView.SelectedItems属性会说我选择了一个项目,因为两个可视选择的

假设我有这些课程:

public class Person
{
     public string Name { get; set; }
}
public class PersonCollection : ObservableCollection<Person> { }
现在我有了一个包含三项的ListView,其中所有三项都是对同一对象的引用。现在我在ListView中选择索引为0和2的项

ListView.SelectedItems属性会说我选择了一个项目,因为两个可视选择的项目是同一个对象


那么,我如何获得视觉上选定的项目,以便删除索引0和2处的项目,而不删除索引1处的项目?

我认为您的模型有问题!无论你想实现什么目标,我都会尝试找到一种更稳健的方法。例如,在某些情况下,这是有意义的,将人们添加到需要多次出现的队列中。在这种情况下,WPF的设计似乎很糟糕。是否可以在集合中的所有项之间手动迭代并检查它们的选择状态?

在WinForms中有
列表框。SelectedDices
属性在这里很有用,但不幸的是,我们在WPF中没有该属性

您可以使用、检查并按索引删除
ListViewItem
s来迭代。但是,这在虚拟化中不起作用,因为如果您从项目中滚动,并且它被虚拟化,则
ContainerFromIndex
可能会返回null

代码如下所示:

for(int ixPerson = myListView.Items.Count - 1; ixPerson >= 0; ixPerson--)
{
   ListViewItem personItem = myListView.ItemContainerGenerator.ContainerFromIndex(ixPerson);
   if (personItem.IsSelected)
   {
      mySourcePersonCollection.RemoveAt(ixPerson);
   }
}

什么意思?也许这就是我想要的功能。如果你对我的业务逻辑有问题,那就离我远点。到目前为止,我还没有发现任何类似的问题,但那将是很好的。谢谢,这样做有效。我不太清楚你说的虚拟化是什么意思,但是对于我们正在做的这个简单的项目,这对我们来说已经足够了。谢谢。我的意思是,由于虚拟化的原因,有时并非Items集合中的每个人都会有ListViewItem。如果选择ListView中的第一个人,然后向下滚动使其消失,则调用ItemContainerGenerator.ContainerFromIndex(0)可能会返回null。
for(int ixPerson = myListView.Items.Count - 1; ixPerson >= 0; ixPerson--)
{
   ListViewItem personItem = myListView.ItemContainerGenerator.ContainerFromIndex(ixPerson);
   if (personItem.IsSelected)
   {
      mySourcePersonCollection.RemoveAt(ixPerson);
   }
}