2011-04-11 6 views
0

WPF TreeView에서 TreeItem의 이동에 문제가 있습니다. 내가 컴파일러라는 항목을 이동하려고하면 은 여기 내 문제WPF Treeview (Children 포함) 항목 위아래로 이동

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); 
    } 

을 당신은 목록을 수정할 수 있습니다 :