c#从下到上在树列表中设置活动菜单

时间:2015-09-16 20:46:21

标签: c# list tree

我有一个班级:

public class Menu
{
     public Menu()
     {
          this.Children = new List<Menu>();
     }

     public string MenuId { get; set; }
     public string Title { get; set; }
     public bool IsActive { get; set; }
     public List<Menu> Children { get; set; }    
}

现在我有一个清单:

List<Menu> menu = new List<Menu>();

鉴于MenuId让我们说20,我如何递归地将属性IsActive设置为菜单的所有父节点,其中MenuId = 20?

enter image description here

这是我的尝试:

  List<Menu> menu = new List<Menu>

        foreach (Menu _menu in menu)
        {
            if (_menu.MenuId == _id)
            {
                _menu.IsActive = true;
                break;
            }
            else
            {
                SetActive(_menu, _id);
            }
        }

    private void SetActive(Menu menu, string _id)
    {
        foreach (Menu _menu in menu.Children)
        {
            if (_menu.MenuId == targetContentId)
            {
                _menu.IsActive = true;
                break;
            }
            else
            {
                SetActive(_menu, _id);
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

Menu有一个事件(例如,它可以实现INotifyPropertyChanged,但它也可以有更强类型的IsActiveChanged事件。< / p>

每当IsActive发生变化时,都会举起该事件。

让所有父母订阅他们的直接孩子&#39;事件,并相应地更新自己的IsActive值。

答案 1 :(得分:1)

这样的事情(假设id在整个结构中是唯一的):

bool FindAndSet(int id, List<Menu> menu)
{
    foreach (var m in menu)
    {
        if (m.MenuId == id)    // base case, this is the item we are looking for
        {
            m.IsActive = true;
            return true;
        }
        else if (m.Children == null || m.Children.Count == 0)
        {
            return false;    // other base case, no more children
        }
        var found = FindAndSet(id, m.Children);    // recurse
        if (found)                                 // if we found it in our descendants
        {
            m.IsActive = true;                     // set is active as we unwind
            return true;
        }
    }
    return false;
}