2013-10-18 46 views
0

在我的程序中,我有一个UserControl,其中包含TreeViewTreeView有一个ViewModel和与之相关的模型。我想这样做,通过点击按钮,我可以在整个树上上下移动节点。这与在listBox上执行的操作类似。在TreeView中上下移动节点

作为参考,我使用的是this article

我在UserControl的代码隐藏中实现了以下功能,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....?) 
     { 

     } 
} 

因为我的结构是不同的,而我实际执行的ObservableCollectionTreeView,我没有获得相同的方法在该示例代码。

以下行是我关心的线条......

  • TreeView.Items();

  • TreeView.Items.Clear();

  • TreeView.Items.Add();

我怎样才能让等效调用与我的TreeView是setu的方式P +请让我知道更多的代码会有帮助。

回答

1

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

MVVM模式说你不关心视图,你不知道视图或视图内的任何控制。

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

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

每当您更改ObservableCollection中的内容时,都会触发收集已更改的事件,并使用适当的事件参数来存储信息,无论您是添加新项目还是移动项目。这就是TreeView如何知道该怎么做。

+0

+1。另外,当我开始使用WPF中的TreeView时,我发现这篇文章非常有用:[使用ViewModel模式简化WPF TreeView](http://www.codeproject.com/Articles/26288/Simplifying-the- WPF-TreeView-by-View-ViewMode) – Sphinxxx

+0

这是一个很好的解释人,谢谢。我最终看着'ObservableCollection.Move();' - http://msdn.microsoft.com/en-us/library/ms654933.aspx –