C# 要执行递归,请在“类别”下加载类别

C# 要执行递归,请在“类别”下加载类别,c#,recursion,treeview,C#,Recursion,Treeview,目前我有这个代码(Deepth=2个类别) 我想做一个递归方法,在这里我可以有n个类别,在类别下等等,我尝试了如下方法: foreach (Kategorie kategorie in mainViewModel.Kategorien) { FillKategorienTreeView(kategorie); } 然后: private void FillKategorienTreeView(Kategorie kategorie) { /

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

我想做一个递归方法,在这里我可以有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,它有一个顶级(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;
[DataMember]
公共整数Id
{
获取{return\u id;}
设置
{
如果(_id!=值)
{
if(ChangeTracker.changetrackinabled&&ChangeTracker.State!=ObjectState.Added)
{
抛出新的InvalidOperationException(“属性“Id”是对象密钥的一部分,无法更改。只有当对象未被跟踪或处于添加状态时,才能更改密钥属性。”);
}
_id=值;
OnPropertyChanged(“Id”);
}
}
}
私人内部id;
[数据成员]
公共字符串bezeichung
{
获取{return\u bezeichung;}
设置
{
如果(_bezeichung!=值)
{
_bezeichnung=数值;
不动产变更(“Bezeichung”);
}
}
}
私有字符串(u bezeichung);
#端区
#区域导航属性
[数据成员]
公共可追踪收集Artikel
{
得到
{
如果(_artikel==null)
{
_artikel=新的TrackableCollection();
_artikel.CollectionChanged+=FixupArtikel;
}
返回(u artikel);;
}
设置
{
如果(!ReferenceEquals(_artikel,value))
{
if(ChangeTracker.ChangeTrackingEnabled)
{
抛出新的InvalidOperationException(“启用ChangeTracking时无法设置FixupChangeTrackingCollection”);
}
如果(_artikel!=null)
{
_artikel.CollectionChanged-=FixupArtikel;
}
_artikel=价值;
如果(_artikel!=null)
{
_artikel.CollectionChanged+=FixupArtikel;
}
OnNavigationPropertyChanged(“Artikel”);
}
}
}
私人可追踪收藏(artikel);
[数据成员]
公共可跟踪收集未登录类别
{
得到
{
如果(_unterkategorie==null)
{
_unterketogorie=新的TrackableCollection();
_UnterkCategorie.CollectionChanged+=FixupUnterkCategorie;
}
返回_unterketogrie;
}
设置
{
如果(!ReferenceEquals(_unterketogorie,value))
{
if(ChangeTracker.ChangeTrackingEnabled)
{
抛出新的InvalidOperationException(“启用ChangeTracking时无法设置FixupChangeTrackingCollection”);
}
如果(_unterkategorie!=null)
{
_UnterkCategorie.CollectionChanged-=FixupUnterkCategorie;
}
_未测试类别=值;
如果(_unterkategorie!=null)
{
_UnterkCategorie.CollectionChanged+=FixupUnterkCategorie;
}
OnNavigationPropertyChanged(“Unterketogrie”);
}
}
}
私人可追踪收藏_unterketogrie;
[数据成员]
公共卡蒂戈里酒店
{
获取{return\u oberkategorie;}
设置
{
如果(!ReferenceEquals(_oberkategorie,value))
{
var previousValue=_OberCategorie;
_OberCategorie=值;
FixUpOberCategorie(以前的值);
OnNavigationPropertyChanged(“OberCategorie”);
}
}
}
二等兵Kategorie_oberkategorie;

仅当每个类别在对象中都有子类别或子类别列表时,此操作才有效。如果没有,则必须为每个项目建立子项列表

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

仅当每个类别在对象中都有子类别或子类别列表时,此操作才有效。如果没有,则必须为每个项目建立子项列表

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

你能给我们看一下卡蒂戈里物体吗?你能给我们看一下卡蒂戈里物体吗?