带子项的C#DragDrop对象导致System.InvalidOperationException

时间:2011-03-17 13:14:34

标签: c# wpf treeview 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代码块,然后当它完成并尝试完成拖放时,它会错误地显示以下错误消息:< / p>

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 个答案:

答案 0 :(得分:1)

正如异常消息所示,问题是您同时枚举和修改同一个集合,这是不允许的:

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

在此您枚举organLocation.SubOrganLocations并在foreach运算符内添加项目。这种行为可能不是你想要的。