c# 从下到上在树列表上设置活动菜单
c# set active menu on a tree list from bottom up
我有一个 class:
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 的菜单的所有父项?
这是我的尝试:
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);
}
}
}
让Menu
有一个事件(例如,它可以实现INotifyPropertyChanged
,但它也可以有一个更强类型的IsActiveChanged
事件)。
每当 IsActive
发生变化时引发该事件。
让所有 parents 订阅他们直系子女的事件,并相应地更新他们自己的 IsActive
值。
像这样(假设 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;
}
我有一个 class:
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 的菜单的所有父项?
这是我的尝试:
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);
}
}
}
让Menu
有一个事件(例如,它可以实现INotifyPropertyChanged
,但它也可以有一个更强类型的IsActiveChanged
事件)。
每当 IsActive
发生变化时引发该事件。
让所有 parents 订阅他们直系子女的事件,并相应地更新他们自己的 IsActive
值。
像这样(假设 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;
}