想要做递归,在undercategory中加载类别

时间:2012-02-21 08:55:48

标签: c# recursion treeview

目前我有这个代码(深度= 2类别)

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

和其他类似的东西,它没有用,我对递归不是那么友好,但在这种情况下它是不可或缺的..

有一个Treeview,它有一个TopLevel(Maincategory),可以有n个/子类别。

希望你能帮助我

编辑:类别对象:

    [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;

1 个答案:

答案 0 :(得分: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);
   }
}