Хотите сделать рекурсию, загрузить категорию в подкатегории - PullRequest
1 голос
/ 21 февраля 2012

На данный момент у меня есть этот код (Deepth = 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);
            //    }
            //}
        }

и другие подобные вещи, и это не сработало, я не очень дружу с рекурсией, но в этом случае это необходимо ..

Есть древовидная структура, которая имеет 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 Ответ

1 голос
/ 21 февраля 2012

Это будет работать, только если у каждой категории есть список дочерних или подкатегорий в объекте.Если нет, то вам нужно будет составить список детей для каждого элемента.

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);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...