我有以下代码:
IEnumerable<TreeItem> rootTreeItems = BuildRootTreeItems();
BuildTreeView(rootTreeItems.ElementAt(0));
private static void BuildTreeView(TreeItem treeItem)
{
TreeItem subMenuTreeItem = new TreeItem();
subMenuTreeItem.Header = "1";
TreeItem subMenuTreeItem2 = new TreeItem();
subMenuTreeItem.Header = "2";
treeItem.TreeItems.Add(subMenuTreeItem);
treeItem.TreeItems.Add(subMenuTreeItem2);
}
奇怪的是在 BuildTreeView 返回后,rootTreeItems 的第一个元素没有任何子节点,而在调试到 BuildTreeView 方法时它确实有。
这个问题困扰了我好久,有大佬知道吗?非常感谢。
请您参考如下方法:
您很可能遇到了 IEnumerable<> 的延迟执行问题.要记住的是你的 IEnumerable<TreeItem> rootTreeItems不是一个列表,而是每次被要求时都会得到一个列表的 promise 。
所以,如果BuildRootTreeItems()创建IEnumerable<TreeItem>使用 LINQ 查询,它不会强制执行使用 .ToList() 的查询或 .ToArray()然后每次你使用 rootTreeItems您正在 BuildRootTreeItems() 中重新执行查询
调用 rootTreeItems.ElementAt(0)将导致查询执行。如果稍后您尝试调用 rootTreeItems.ElementAt(0)再次执行查询并取回第一个 TreeItem 的不同实例.
尝试像这样更改第一行:
IEnumerable<TreeItem> rootTreeItems = BuildRootTreeItems().ToArray();
这会强制执行并防止稍后重新执行。我敢打赌你的问题就会消失。
