Дерьмо. Я нашел проблему. Не берите в голову. Когда элемент был удален, он должен был быть заменен другим элементом, но до того, как замена могла произойти, было инициировано событие, которое удалило неправильный элемент, поскольку замена еще не произошла.
В обоих случаях утверждения не выполняются:
var item4 = listBox.Items[4];
var item5 = listBox.Items[5];
listBox.Items.Remove(item5);
Debug.Assert(listBox.Items.Contains(item4), "item4 not found");
Debug.Assert(!listBox.Items.Contains(item5), "item5 still found");
И
var item4 = listBox.Items[4];
var item5 = listBox.Items[5];
listBox.Items.RemoveAt(5);
Debug.Assert(listBox.Items.Contains(item4), "item4 not found");
Debug.Assert(!listBox.Items.Contains(item5), "item5 still found");
Элементы ListBox являются пользовательскими классами. ListBox является владельцем нарисованным.
Утверждение item4 != item5
проходит.