C# 使用拖放重新排序TreeView&;滴

C# 使用拖放重新排序TreeView&;滴,c#,wpf,treeview,C#,Wpf,Treeview,我试图达到的最终目标是能够通过将项目拖放到新的顺序中来重新排序TreeView。当我试图从TreeViewItem获取原始对象“ModeObject”时,我遇到了一个强制转换错误。。。我在列表视图上执行完全相同的操作,所以我不确定这为什么会给我一个错误 ModeObject mo = (ModeObject)tv.ItemContainerGenerator.ItemFromContainer(tvitem); 无法将类型为“MS.Internal.NamedObject”的对象强制转换为类型

我试图达到的最终目标是能够通过将项目拖放到新的顺序中来重新排序
TreeView
。当我试图从
TreeViewItem
获取原始对象“ModeObject”时,我遇到了一个强制转换错误。。。我在
列表视图上执行完全相同的操作,所以我不确定这为什么会给我一个错误

ModeObject mo = (ModeObject)tv.ItemContainerGenerator.ItemFromContainer(tvitem);
无法将类型为“MS.Internal.NamedObject”的对象强制转换为类型 “ModeObject”




publicobservableCollection模式{get;set;}
...
私有void TvModes_PreviewMouseMove(对象发送器,System.Windows.Input.MouseEventArgs e){
鼠标点=e.GetPosition(null);
Vector diff=ModereOrdersStartPoint-鼠标点;
如果(e.LeftButton==System.Windows.Input.MouseButtonState.Pressed&&
(数学Abs(diff.X)>系统参数。最小水平牵引距离||
数学。Abs(差异Y)>系统参数。最小垂直牵引距离){
TreeView tv=发送方为TreeView;
TreeViewItem tvitem=FindAncestor((DependencyObject)e.OriginalSource);
ModeObject mo=(ModeObject)tv.ItemContainerGenerator.ItemFromContainer(tvitem);
DataObject dragData=新的DataObject(“reorderMode”,mo);
DragDrop.DoDragDrop((DependencyObject)e.OriginalSource、dragData、DragDropEffects.Move);
}
}

公共类模式{
公共字符串名称{get;set;}
公共ObservableCollection通道{get;set;}
公共模式(){
通道=新的ObservableCollection();
}
}
公共类ModeObject{
公共字符串名称{get;set;}
公共int ChannelIndex{get;set;}
}

MS.Internal.NamedObject的确切含义是什么?如何解决此错误?

有点晚,但可能对有相同问题的人有用。 由于此树是数据绑定的,因此可以从其数据上下文而不是ItemContainerGenerator访问每个树项的数据对象。 在提供的示例中,旧行:

ModeObject mo = (ModeObject)tv.ItemContainerGenerator.ItemFromContainer(tvitem);
替换为:

ModeObject mo = (ModeObject)tvitem.DataContext;

有点晚了,但可能对有同样问题的人有用。 由于此树是数据绑定的,因此可以从其数据上下文而不是ItemContainerGenerator访问每个树项的数据对象。 在提供的示例中,旧行:

ModeObject mo = (ModeObject)tv.ItemContainerGenerator.ItemFromContainer(tvitem);
替换为:

ModeObject mo = (ModeObject)tvitem.DataContext;
ModeObject mo = (ModeObject)tvitem.DataContext;