我已经在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);
有谁知道如何以递归方式将子节点添加到对象树中?
答案 0 :(得分:1)
正如异常消息所示,问题是您同时枚举和修改同一个集合,这是不允许的:
ObservableCollection<OrganLocationViewModel> subOrgans = organLocation.SubOrganLocations;
foreach (OrganLocationViewModel node in subOrgans)
{
organLocation.SubOrganLocations.Add(node);
node.ParentOrganLocation = organLocation;
}
在此您枚举organLocation.SubOrganLocations
并在foreach
运算符内添加项目。这种行为可能不是你想要的。