Я пытаюсь реализовать функцию поиска в пользовательском ListView, и поэтому я скрываю Items с пользовательским ObservableCollection, который позволяет AddRange, подобно один, определенный на damonpayne.com (для tl; dr-ers там в основном он подавляет стрельбу OnCollectionChanged при добавлении нескольких элементов, а затем срабатывает с NotifyCollectionChangedAction.Reset):
public new MyCollection<ListViewItem> Items { get; protected set; }
MyCollection_CollectionChanged() заполняет base.Items:
this.BeginUpdate();
base.Items.Clear();
base.Items.AddRange(this.Items.ToArray());
this.EndUpdate();
Идея состоит в том, что, когда элементы не удовлетворяют условиям поиска, они удаляются из base.Items (то есть System.Windows.Forms.ListView), но остаются в this.Items (т.е. My.Name.Space.MyListView). Когда поиск отменяется или изменяются термины, base.Items может быть заселен this.Items.
Это работает отлично и, как ожидалось, за исключением небольшого, но важного оговорки:
Проблема заключается в том, что ListViewItem s 'Group не всегда переносится от this.Items до base.Items, и поэтому все элементы отображаются в группе "По умолчанию".
Любые идеи относительно того, почему это происходит и как это исправить?
Update
Я все еще придерживаюсь этого. Разумеется, .ToArray() создает мелкую копию Items, поэтому сохранить Group?
Это подтверждено Maverik:
Обновление 2
Хорошо, после нескольких исследований я обнаружил, где это происходит.
При добавлении ListViewItem в MyCollection<ListViewItem>:
var item0 = new ListViewItem();
var item0.Group = this.Groups["foo"];
//here this.Items.Count = 0
this.Items.Add(item0);
//here this.Items.Count = 1 with item0 having group "foo"
var item1 = new ListViewItem();
var item1.Group = this.Groups["bar"];
//here this.Items.Count = 1 with item0 having group "foo"
this.Items.Add(item1);
//here this.Items.Count = 2 with item0 having group "null" and item1 having group "bar"
Я также проверил это, заменив MyCollection< на нормальный ObservableCollection<, и то же самое происходит.
Обновление 3 - Решение
Пожалуйста, см. мой ответ.