C# 在树视图中上下移动节点

C# 在树视图中上下移动节点,c#,wpf,treeview,observablecollection,C#,Wpf,Treeview,Observablecollection,在我的程序中,我有一个UserControl,它包含一个TreeView。TreeView有一个ViewModel和一个与之相关的模型。我希望通过单击按钮,可以在整个树中上下移动节点。这与在列表框上实现的类似 作为指导,我正在使用 我正在将以下函数实现到用户控件的代码隐藏中,TreeView //Move up private void moveUp_Click(object sender, RoutedEventArgs e) { if(UCViewModel.TreeView.Se

在我的程序中,我有一个UserControl,它包含一个
TreeView
TreeView
有一个ViewModel和一个与之相关的模型。我希望通过单击按钮,可以在整个树中上下移动节点。这与在
列表框上实现的类似

作为指导,我正在使用

我正在将以下函数实现到用户控件的代码隐藏中,
TreeView

//Move up
private void moveUp_Click(object sender, RoutedEventArgs e)
{
     if(UCViewModel.TreeView.SelectedItem != null)
     {
          if(UCViewModel.TreeView.SelectedItem is TreeModel)
          {
               TreeModel tm = UCViewModel.TreeView.SelectedItem as TreeModel;
               if(tm.Rank != 1)
               {

               }
          }
     }
}
private void MoveUp(TreeModel tm)
{                                //My guess on how to call the equivalent command...
      foreach (TreeModel item in // **UCViewModel.TreeView.GetAllChildren....? )
      {

      }
}
因为我的结构不同,而且我实际上是以
TreeView
的形式实现一个
observeCollection
,所以我无法访问与示例中的代码相同的方法

以下几行是我关心的几行

  • TreeView.Items()

  • TreeView.Items.Clear()

  • TreeView.Items.Add()

如何使用我的
TreeView
设置方式进行等效调用?请告诉我更多的代码是否有用。

MVVM的主要思想是不使用类似treeView.Items.Add()或treeView.GetAllChildren()或treeView中需要的任何方法

MVVM模式表示您不关心视图,也不知道视图或视图中的任何控件

因此,如果您的ViewModel中有一个ObservableCollection作为ItemsSource,您只需要将项目移动到那里,TreeView就会跟随您

就这么简单。您的TreeView只需要知道ObservableCollection在ViewModel中的位置


无论何时在ObservableCollection中更改某些内容,都会触发collection changed事件,并使用适当的事件参数保存信息,无论您是添加了新项还是移动了项。这就是TreeView知道该做什么的方式。

+1。另外,当我开始在WPF中使用
TreeView
s时,我发现这篇文章非常有用:这是一个很好的解释,谢谢。我最后查看了
observeablecollection.Move()--