C # DragDrop объект с дочерними результатами приводит к System.InvalidOperationException - PullRequest
0 голосов
/ 17 марта 2011

Я реализовал Drag and Drop для дерева в WPF, которое работает как задумано. Однако это только добавление корневого элемента (перетаскиваемого) к объекту данных, содержащему значения дерева, но добавление всех дочерних элементов (и их дочерних элементов и т. Д.) В визуальное дерево.

Вот моя первая попытка добавить дочерние объекты в объект данных (это должно добавить первый подуровень):

public void DropNewProjectOrganLocation(OrganLocationViewModel organLocation)
    {
        _projOrganLocation.Add(organLocation);
        ObservableCollection<OrganLocationViewModel> subOrgans = organLocation.SubOrganLocations;
        foreach (OrganLocationViewModel node in subOrgans)
        {
                organLocation.SubOrganLocations.Add(node);
                node.ParentOrganLocation = organLocation;

        }
    }

Теперь, когда я перетаскиваю элемент, у которого нет дочерних элементов, он работает как задумано (и добавляется в дерево объектов, а также в дерево визуалов). Однако, когда я пытаюсь перетащить элемент, имеющий любое количество дочерних элементов, он проходит через кодовый блок foreach, затем, когда он завершает работу и пытается завершить перетаскивание, он выдает следующее сообщение об ошибке:

An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationCore.dll Additional information: Collection was modified; enumeration operation may not execute

и я использую метод DoDragDrop из System.Windows.DragDrop Вот строка, которая вызывает ошибку: System.Windows.DragDrop.DoDragDrop(m_DragInfo.VisualSource, data, m_DragInfo.Effects);

Кто-нибудь знает, как я могу рекурсивно добавлять дочерние узлы в дерево объектов?

1 Ответ

1 голос
/ 17 марта 2011

Как следует из сообщения об исключении, проблема в том, что вы перечисляете и изменяете одну и ту же коллекцию одновременно, что недопустимо:

ObservableCollection<OrganLocationViewModel> subOrgans = organLocation.SubOrganLocations;
foreach (OrganLocationViewModel node in subOrgans)
{
        organLocation.SubOrganLocations.Add(node);
        node.ParentOrganLocation = organLocation;
}

Здесь вы перечисляете organLocation.SubOrganLocations и внутри оператора foreach добавляете элементы. И это поведение, вероятно, не то, что вы хотите.

...