WPF:具有重复对象引用的SelectedItems

时间:2009-03-11 16:04:36

标签: c# wpf listview

所以我想说我有这些课程:

public class Person
{
     public string Name { get; set; }
}
public class PersonCollection : ObservableCollection<Person> { }

并且假设我有一个ListView,其ItemsSource绑定到PersonCollection。现在让我说我有这个代码:

public void AddPeople()
{
     Person p = new Person() { Name = "Someone" };
     MyPersonCollection.Add(p);
     MyPersonCollection.Add(p);
     MyPersonCollection.Add(p);
}

所以现在我有一个包含三个项目的ListView,其中所有三个项目都是对SAME对象的引用。所以现在我选择让我们说ListView中索引为0和2的项目。

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

那么如何才能获得视觉上选择的项目,以便我可以删除索引0和2处的项目,而无需删除索引1处的项目?

3 个答案:

答案 0 :(得分:2)

在WinForms中,ListBox.SelectedIndices属性在这里很有用,但遗憾的是我们在WPF中没有这个...

您可以使用ItemContainerGenerator.ContainerFromIndex遍历ListViewItem,检查ListViewItem.IsSelected,然后按索引删除它们。但是,这在虚拟化方面效果不佳,因为如果您从项目中滚动并且它被虚拟化,ContainerFromIndex可能会返回null。

代码看起来像这样:

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

答案 1 :(得分:1)

在某些情况下,这是有道理的,例如,将人员添加到需要多次出现的队列中。对于这种情况,似乎WPF的设计很差。是否可以手动迭代集合中的所有项目并检查其选择状态?

答案 2 :(得分:-2)

我认为您的模型有问题!无论你想要实现什么,我都会尝试找到一种更强大的方法。