要做递归,请在undertegory中加载类别

本文关键字:加载 undertegory 请在 递归 | 更新日期: 2023-09-27 18:25:20

目前我有这个代码(深度=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);
                    }
                }
            }
        }
    }
}

我想做一个递归方法,在那里我可以在子类别中有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;

要做递归,请在undertegory中加载类别

只有当每个类别在对象中都有子类别或子类别的列表时,这才会起作用。如果没有,那么您将不得不为每个项目建立子项列表。

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