Если вам нужно сделать именно то, что вы перечислили, я бы порекомендовал добавить «слой» логики до фактической привязки к спискам.
т.е:.
Вместо привязки данных непосредственно к ListBoxes, создайте List <> datarows (или ваш собственный объект). Когда вам нужно отсортировать список, вызовите метод .Sort () в List <> для любого свойства / столбца, который вам нужен, а затем очистите списки ListBox, заново заполняйте их на основе вашего List <> (возможно, добавив ListItems по одному время для каждого блока), а затем исправьте SelectedIndex (s) ListBoxes.
Делая так, вы никогда не потеряете связь между строками ListBoxes.