private void MoveElementWithChange() { if (IsReadOnly) { return; } if (movedElementFrom == null || movedElementTo == null || movedElementFrom == movedElementTo) { return; } DirElement newParent = movedElementTo.Parent; BindingList <Element> bindingList = (listView.ItemsSource as BindingList <Element>); int index = 0; if (movedElementTo.Delete()) { index = bindingList.IndexOf(movedElementTo); bindingList.Remove(movedElementTo); } else { System.Windows.MessageBox.Show("Не вдається перемістити елемент"); return; } if (!newParent.Exists) { movedElementTo.Restore(); bindingList.Insert(index, movedElementTo); System.Windows.MessageBox.Show("Не вдається перемістити елемент"); return; } try { movedElementFrom.Parent = newParent; movedElementFrom.Name = movedElementTo.Name; } catch { movedElementTo.Restore(); bindingList.Insert(index, movedElementTo); System.Windows.MessageBox.Show("Не вдається перемістити елемент"); return; } int oldIndex = bindingList.IndexOf(movedElementFrom); bindingList.Remove(movedElementFrom); if (index > oldIndex) { index = (index - 1) >= 0 ? index - 1 : 0; } bindingList.Insert(index, movedElementFrom); int i = 0; while (i < bindingList.Count) { if (!bindingList[i].Exists) { bindingList.RemoveAt(i); i--; } i++; } movedElementFrom = null; movedElementTo = null; }