WPF Treeview (с детьми) перемещать элемент вверх и вниз - PullRequest
0 голосов
/ 11 апреля 2011

У меня проблема с перемещением 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 Ответ

1 голос
/ 11 апреля 2011

Вы не можете изменить коллекцию, пока выполняете ее, используя 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);
  }

Используя этот «трюк», вы сможете изменить список:)

...