WPF: SelectedItems с дублирующимися ссылками на объекты - PullRequest
2 голосов
/ 11 марта 2009

Допустим, у меня есть следующие классы:

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 с тремя элементами, в которых все три элемента являются ссылками на один и тот же объект. Итак, теперь я выбираю, скажем, элементы с индексами 0 и 2 в ListView.

Свойство ListView.SelectedItems скажет, что я выбрал ОДИН элемент, поскольку оба визуально выбранных элемента - ОДИН И ТОТ ЖЕ объект.

Так как я могу получить визуально выбранные элементы, чтобы я мог удалить элементы с индексами 0 и 2, не удаляя элемент с индексом 1?

Ответы [ 3 ]

2 голосов
/ 11 марта 2009

В WinForms есть свойство ListBox.SelectedIndices, которое было бы здесь полезно, но, к сожалению, его нет в WPF ...

Вы можете перебирать ListViewItem s, используя ItemContainerGenerator.ContainerFromIndex, отмечать ListViewItem.IsSelected и затем удалять их по индексу. Однако это не очень хорошо с виртуализацией, потому что ContainerFromIndex может вернуть ноль, если вы прокрутите от элемента, и он будет виртуализирован.

Код будет выглядеть примерно так:

for(int ixPerson = myListView.Items.Count - 1; ixPerson >= 0; ixPerson--)
{
   ListViewItem personItem = myListView.ItemContainerGenerator.ContainerFromIndex(ixPerson);
   if (personItem.IsSelected)
   {
      mySourcePersonCollection.RemoveAt(ixPerson);
   }
}
1 голос
/ 11 марта 2009

В некоторых случаях это имеет смысл, например, добавление людей в очередь, где желательно появление более одного раза. Для этого случая кажется, что WPF разработан плохо. Можно ли вручную перебирать все элементы в коллекции и проверять их состояние выбора?

0 голосов
/ 11 марта 2009

Я думаю, что-то не так с вашей моделью! Чего бы вы ни пытались достичь, я бы попытался найти более надежный способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...