Я пытаюсь реализовать функцию поиска в пользовательском 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 - Решение
Пожалуйста, см. мой ответ.