2013-10-18 40 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 –