所以我想说我有这些课程:
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处的项目?
答案 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)
我认为您的模型有问题!无论你想要实现什么,我都会尝试找到一种更强大的方法。