2012-02-21 56 views
1

的载荷种类目前,我有这样的代码(走向深沉= 2个类别)想要做递归,在undercategory

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    foreach (Kategorie kategorie in mainViewModel.Kategorien) 
    { 
     if (kategorie.Oberkategorie == null) 
     { 
      TreeViewItem newChild = new TreeViewItem(); 
      newChild.Header = kategorie.Bezeichnung; 
      treeView.Items.Add(newChild); 

      foreach (Kategorie unterkategorie in mainViewModel.Kategorien) 
      { 
       if (unterkategorie.Oberkategorie != null) 
       { 
        if (unterkategorie.Oberkategorie.Id == kategorie.Id) 
        { 
         TreeViewItem subItem = new TreeViewItem(); 
         subItem.Header = unterkategorie.Bezeichnung; 
         newChild.Items.Add(subItem); 
        } 
       } 
      } 
     } 
    } 
} 

我想作一个递归方法,在那里我可以在undercategories N类和等等,我想喜欢的东西:

foreach (Kategorie kategorie in mainViewModel.Kategorien) 
{ 
     FillKategorienTreeView(kategorie); 
} 

然后:

private void FillKategorienTreeView(Kategorie kategorie) 
     { 
      //if (kategorie.Oberkategorie == null) 
      //{ 
      // TreeViewItem newChild = new TreeViewItem(); 
      // newChild.Header = kategorie.Bezeichnung; 
      // treeView.Items.Add(newChild); 
      //} 
      //else 
      //{ 
      // if (kategorie.Oberkategorie.Id == kategorie.Id) 
      // { 
      //  TreeViewItem subItem = new TreeViewItem(); 
      //  subItem.Header = kategorie.Bezeichnung; 
      //  newChild.Items.Add(subItem); 
      // } 
      //} 
     } 

等similiar东西,它没有工作,我对递归不太友善,但在这种情况下,它是不可或缺的。

有一个树视图,它有一个TopLevel(Maincategory),并且可以有n个子/子类别。

希望u能帮助我

编辑:类别对象:

[DataMember] 
    public int Id 
    { 
     get { return _id; } 
     set 
     { 
      if (_id != value) 
      { 
       if (ChangeTracker.ChangeTrackingEnabled && ChangeTracker.State != ObjectState.Added) 
       { 
        throw new InvalidOperationException("The property 'Id' is part of the object's key and cannot be changed. Changes to key properties can only be made when the object is not being tracked or is in the Added state."); 
       } 
       _id = value; 
       OnPropertyChanged("Id"); 
      } 
     } 
    } 
    private int _id; 

    [DataMember] 
    public string Bezeichnung 
    { 
     get { return _bezeichnung; } 
     set 
     { 
      if (_bezeichnung != value) 
      { 
       _bezeichnung = value; 
       OnPropertyChanged("Bezeichnung"); 
      } 
     } 
    } 
    private string _bezeichnung; 

    #endregion 
    #region Navigation Properties 

    [DataMember] 
    public TrackableCollection<Artikel> Artikel 
    { 
     get 
     { 
      if (_artikel == null) 
      { 
       _artikel = new TrackableCollection<Artikel>(); 
       _artikel.CollectionChanged += FixupArtikel; 
      } 
      return _artikel; 
     } 
     set 
     { 
      if (!ReferenceEquals(_artikel, value)) 
      { 
       if (ChangeTracker.ChangeTrackingEnabled) 
       { 
        throw new InvalidOperationException("Cannot set the FixupChangeTrackingCollection when ChangeTracking is enabled"); 
       } 
       if (_artikel != null) 
       { 
        _artikel.CollectionChanged -= FixupArtikel; 
       } 
       _artikel = value; 
       if (_artikel != null) 
       { 
        _artikel.CollectionChanged += FixupArtikel; 
       } 
       OnNavigationPropertyChanged("Artikel"); 
      } 
     } 
    } 
    private TrackableCollection<Artikel> _artikel; 

    [DataMember] 
    public TrackableCollection<Kategorie> Unterkategorie 
    { 
     get 
     { 
      if (_unterkategorie == null) 
      { 
       _unterkategorie = new TrackableCollection<Kategorie>(); 
       _unterkategorie.CollectionChanged += FixupUnterkategorie; 
      } 
      return _unterkategorie; 
     } 
     set 
     { 
      if (!ReferenceEquals(_unterkategorie, value)) 
      { 
       if (ChangeTracker.ChangeTrackingEnabled) 
       { 
        throw new InvalidOperationException("Cannot set the FixupChangeTrackingCollection when ChangeTracking is enabled"); 
       } 
       if (_unterkategorie != null) 
       { 
        _unterkategorie.CollectionChanged -= FixupUnterkategorie; 
       } 
       _unterkategorie = value; 
       if (_unterkategorie != null) 
       { 
        _unterkategorie.CollectionChanged += FixupUnterkategorie; 
       } 
       OnNavigationPropertyChanged("Unterkategorie"); 
      } 
     } 
    } 
    private TrackableCollection<Kategorie> _unterkategorie; 

    [DataMember] 
    public Kategorie Oberkategorie 
    { 
     get { return _oberkategorie; } 
     set 
     { 
      if (!ReferenceEquals(_oberkategorie, value)) 
      { 
       var previousValue = _oberkategorie; 
       _oberkategorie = value; 
       FixupOberkategorie(previousValue); 
       OnNavigationPropertyChanged("Oberkategorie"); 
      } 
     } 
    } 
    private Kategorie _oberkategorie; 
+0

你能告诉我们Kategorie对象吗? – Arion 2012-02-21 09:04:45

+0

我刚刚添加了它 – eMi 2012-02-21 09:08:27

回答

1

如果每个类别都有孩子或子类的对象的列表,这只会工作。如果没有,那么你将不得不建立每个项目的儿童名单。

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    foreach (Kategorie kategorie in mainViewModel.Kategorien) 
    { 
     LoadTreeviewItem(kategorie, null); 
    } 
} 

private void LoadTreeviewItem(Kategorie kategorie, TreeViewItem parentItem) 
{ 
    //Stop condition 
    if(kategorie == null) return; 

    TreeViewItem newChild = new TreeViewItem(); 
    newChild.Header = kategorie.Bezeichnung; 
    treeView.Items.Add(newChild); 

    if(parentItem != null) // Add to parent if it is not null 
    { 
     parentItem.Items.Add(newChild); 
    } 
    else //Otherwise this is the top level so add to treeview 
    { 
     treeView.Items.Add(newChild); 
    } 

    foreach (Kategorie subkategorie in kategorie.Unterkategorie) 
    { 
     LoadTreeviewItem(subkategorie, parentItem); 
    } 
}