WPF .NET 6.0克隆TreeView项报MissingMethodException如何解决
WPF .NET 6.0 TreeView项跨控件复制解决方案
错误原因
你遇到的System.MissingMethodException报错有两个核心问题:
System.Windows.Controls.ItemCollection没有公共无参构造函数,它的实例只能由TreeView等ItemsControl控件内部创建,通用克隆工具无法绕过这个限制直接实例化该类- 你的原有逻辑即使克隆成功,把整个ItemCollection作为单个项Add到目标TreeView,也只会把集合当成一个独立节点展示,无法实现所有项的层级复制
正确实现方式
不要直接克隆ItemCollection,改为递归复制每个TreeViewItem的属性和子节点即可:
1. 新增递归复制方法
Private Function CloneTreeViewItem(sourceItem As TreeViewItem) As TreeViewItem Dim clonedItem As New TreeViewItem() ' 复制需要的属性,可根据需求扩展 clonedItem.Header = sourceItem.Header clonedItem.Tag = sourceItem.Tag clonedItem.IsExpanded = sourceItem.IsExpanded ' 递归复制所有子节点 For Each child In sourceItem.Items If TypeOf child Is TreeViewItem Then clonedItem.Items.Add(CloneTreeViewItem(CType(child, TreeViewItem))) Else ' 若子项为绑定的数据对象,可按需做深拷贝后添加 clonedItem.Items.Add(child) End If Next Return clonedItem End Function
2. 替换原有调用代码
CategoryList_Copy.Items.Clear() ' 遍历原TreeView所有根节点逐一复制 For Each rootItem In CategoryList.Items If TypeOf rootItem Is TreeViewItem Then CategoryList_Copy.Items.Add(CloneTreeViewItem(CType(rootItem, TreeViewItem))) Else CategoryList_Copy.Items.Add(rootItem) End If Next
补充说明
如果你的TreeView采用MVVM模式绑定了数据源,更简单的方案是直接深拷贝原数据源集合,赋值给目标TreeView的ItemsSource即可,不需要操作控件层面的ItemCollection。
内容的提问来源于stack exchange,提问作者Avrigeanu Laurian
相关产品推荐
相关产品推荐

