2011-04-11 77 views
0

我在WPF TreeView中有一個TreeItem的移動問題。 這裏是我的問題WPF Treeview(帶孩子)上下移動項目

public class Workflow { 

    public string Name { get; set; } 
    public int Rank { get; set; } 

    private ObservableCollection<Workflow> childWorkflowsValue = new ObservableCollection<Workflow>(); 
    public ObservableCollection<Workflow> ChildWorkflows { 
     get { 
     return childWorkflowsValue; 
     } 
     set { 
     childWorkflowsValue = value; 
     } 
    } 

    public Workflow() { } 

    public Workflow(string name, int rank) { 
     Name = name; 
     Rank = rank; 
    } 
} 

的項目和運動

private void FillWithData() { 

    myWorkflow.Add(new Workflow("Airbag ausgelöst", 0)); 
    myWorkflow.Add(new Workflow("Abstand halten", 1)); 
    Workflow SubWorkflow = new Workflow("Vorgehen", 2); 
    SubWorkflow.ChildWorkflows.Add(
     new Workflow("Innenraum kontrollieren", 0)); 
    SubWorkflow.ChildWorkflows.Add(
     new Workflow("Spuren des Airbags suchen", 1)); 
    SubWorkflow.ChildWorkflows.Add(
     new Workflow("Airbag zur seite drücken", 2)); 
    myWorkflow.Add(SubWorkflow); 
    myTreeView.DataContext = myWorkflow; 
} 

private void btnMoveUp_Click(object sender, RoutedEventArgs e) { 

    var currentWf = this.myTreeView.SelectedItem as Workflow; 

    if (currentWf != null) { 

    FindRecursive(myWorkflow, currentWf.Name); 
    } 

} 

private void FindRecursive(ObservableCollection<Workflow> wf, string searchText) { 

    foreach (var item in wf) { 
    if (item.Name == searchText) { 

     wf.Move(item.Rank, item.Rank-1); 
     //problem in here 
    } 

    FindRecursive(item.ChildWorkflows, searchText); 
    } 
} 

邏輯當我嘗試移動編譯器說的項目:它是不允許修改集合。 我也搜索了網絡的解決方案,但沒有機會。 可能有更好的方法來做到這一點。

回答

1

在使用foreach遍歷整個集合時,無法修改集合。

我通常使用兩種不同的方式避免這種問題:

var itemToMove; 
foreach (var item in wf) { 
    if (item.Name == searchText) { 
     itemToMove = item 
    } 

    FindRecursive(item.ChildWorkflows, searchText); 
    } 
wf.Move(itemToMove.Rank, itemToMove.Rank-1); 

或者

ObservableCollection<Workflow> wfclone = new ObservableCollection<Workflow>(wf); 
foreach (var item in wfclone) { 
    if (item.Name == searchText) { 

     wf.Move(item.Rank, item.Rank-1); 
    } 

    FindRecursive(item.ChildWorkflows, searchText); 
    } 

使用這種「伎倆」,你就可以修改列表:)