WPF Treeview(带孩子)上下移动物品

WPF Treeview(带孩子)上下移动物品,wpf,treeview,move,Wpf,Treeview,Move,我对WPF树视图中树元素的移动有问题。 这是我的问题所在 public class Workflow { public string Name { get; set; } public int Rank { get; set; } private ObservableCollection<Workflow> childWorkflowsValue = new ObservableCollection<Workflow>(); publ

我对WPF树视图中树元素的移动有问题。 这是我的问题所在

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;
    }
}
公共类工作流{
公共字符串名称{get;set;}
公共整数秩{get;set;}
私有ObservableCollection子工作流值=新ObservableCollection();
公共可观测集合子工作流{
得到{
返回子工作流值;
}
设置{
子工作流值=值;
}
}
公共工作流(){}
公共工作流(字符串名称,整数秩){
名称=名称;
秩=秩;
}
}
以及运动的逻辑

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);
  }
}
private void FillWithData(){
添加(新工作流(“Airbag ausgelöst”,0));
添加(新工作流(“Abstand halten”,1));
工作流子工作流=新工作流(“Vorgehen”,2);
子工作流.ChildWorkflows.Add(
新的工作流程(“Innenraum kontrollieren”,0);
子工作流.ChildWorkflows.Add(
新的工作流程(“Spuren des Airbags suchen”,1);
子工作流.ChildWorkflows.Add(
新的工作流程(“安全气囊zur seite drücken”,2);
添加(子工作流);
myTreeView.DataContext=myWorkflow;
}
私有void btnmovup\u单击(对象发送方,路由目标){
var currentWf=this.myTreeView.SelectedItem作为工作流;
如果(当前WF!=null){
FindRecursive(myWorkflow,currentWf.Name);
}
}
私有void FindRecursive(ObservableCollection wf,字符串搜索文本){
foreach(wf中的var项目){
如果(item.Name==searchText){
wf.Move(item.Rank,item.Rank-1);
//这里有问题吗
}
FindRecursive(item.ChildWorkflows、searchText);
}
}
当我尝试移动项目时,编译器会说:不允许修改集合。 我也在网上搜索解决方案,但没有机会。
可能有更好的方法可以做到这一点。

在使用
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);

observetecollection wfclone=新的observetecollection(wf);
foreach(wfclone中的变量项){
如果(item.Name==searchText){
wf.Move(item.Rank,item.Rank-1);
}
FindRecursive(item.ChildWorkflows、searchText);
}
使用这种“技巧”,您可以修改列表:)

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