在TreeView中上下移动节点

时间:2013-10-18 18:31:44

标签: c# wpf treeview observablecollection

在我的程序中,我有一个包含TreeView的UserControl。 TreeView有一个ViewModel和一个与之相关的模型。我想这样做,通过点击按钮,我可以在整个树上上下移动节点。这类似于listBox上可能实现的内容。

作为指南,我使用this article

我将以下函数实现到TreeView存在的UserControl的代码隐藏中。

//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....? )
      {

      }
}

因为我的结构不同,而我实际上将ObservableCollection实现为TreeView,所以我无法访问与示例中的代码相同的方法。

以下几行是我关注的......

  • TreeView.Items();

  • TreeView.Items.Clear();

  • TreeView.Items.Add();

如何以TreeView设置的方式进行等效调用?如果有更多代码可以提供帮助,请告诉我。

1 个答案:

答案 0 :(得分:1)

MVVM的主要思想不是使用treeView.Items.Add()或treeView.GetAllChildren()或TreeView所需的任何方法。

MVVM Pattern表示你不关心View,你不了解View中的View或任何控件。

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

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

无论何时在ObservableCollection中更改某些内容,都会触发集合已更改事件,并使用适当的事件参数保存信息,无论您是添加新项目还是已移动项目。这就是TreeView将如何做的事情。