0
我有一个引用ID,Name和ParentID的对象列表。我试图创建树视图。但它没有显示任何东西。你能帮我创建一个treeView,我分享下面的代码。如何从WPF中的对象列表创建TreeView
public class WorkFlowScriptIDDataStore
{
public string Id;
public string Name;
public string ParentId;
public List<WorkFlowScriptIDDataStore> Subcategories;
public void Clear()
{
Id = "";
Name = "";
ParentId = "";
}
}
private void PopulateTreeView()
{
List<WorkFlowScriptIDDataStore> localstore = new List<WorkFlowScriptIDDataStore>();
List<WorkFlowScriptIDDataStore> WorkFlowScriptIDDataList = new List<WorkFlowScriptIDDataStore>();
WorkFlowScriptIDDataList.Clear();
int i = 0;
foreach (string node in CurrentScriptids)
{
WorkFlowScriptIDDataList.Add(new WorkFlowScriptIDDataStore());
if (node.Contains(StatusCodes.TAC_TXT_SCENARIOINDEX))
{
datamgm = new TestScenarioConfigurationManager(LayoutConfigurationManager.GetInstance());
WorkFlowScriptIDDataList[i].Id = node;
WorkFlowScriptIDDataList[i].Name = datamgm.GetValue(node, "Name");
WorkFlowScriptIDDataList[i].ParentId = sessionmgm.ScriptID;
}
else if (node.Contains(StatusCodes.TAC_TXT_SEQUENCEINDEX))
{
datamgm = new TestSequenceConfigurationManager(LayoutConfigurationManager.GetInstance());
WorkFlowScriptIDDataList[i].Id = node;
WorkFlowScriptIDDataList[i].Name = datamgm.GetValue(node, "Name");
WorkFlowScriptIDDataList[i].ParentId = sessionmgm.ScriptID;
}
else if (node.Contains(StatusCodes.TAC_TXT_CASEINDEX))
{
datamgm = new TestCaseConfigurationManager(LayoutConfigurationManager.GetInstance());
WorkFlowScriptIDDataList[i].Id = node;
WorkFlowScriptIDDataList[i].Name = datamgm.GetValue(node, "Name");
WorkFlowScriptIDDataList[i].ParentId = sessionmgm.ScriptID;
}
else
{
datamgm = new TestStepConfigurationManager(LayoutConfigurationManager.GetInstance());
WorkFlowScriptIDDataList[i].Id = node;
WorkFlowScriptIDDataList[i].Name = datamgm.GetValue(node, "Name");
WorkFlowScriptIDDataList[i].ParentId = sessionmgm.ScriptID;
}
i++;
}
foreach (var item in WorkFlowScriptIDDataList)
{
localstore.Add(item);
}
while (StartWithTreeviewItem(localstore).Count > 0)
{
GetTreeviewItems(ref localstore);
}
//Creation -TreeView
IEnumerable<WorkFlowScriptIDDataStore> data = WorkFlowScriptIDDataList;
var lookup = data.ToLookup(foo => foo.ParentId,
foo => new TreeItem<object>() { Item = foo });
foreach (var node in lookup.SelectMany(x => x))
node.Children = lookup[((WorkFlowScriptIDDataStore)(node.Item)).Name];
var rootNodes = lookup[null];
treeView.ItemsSource = rootNodes;
}
private List<WorkFlowScriptIDDataStore> StartWithTreeviewItem(List<WorkFlowScriptIDDataStore> lst)
{
return lst.Where(item => item.Id.StartsWith("TSC") ||
item.Id.StartsWith("TSQ") || item.Id.StartsWith("TC")).ToList();
}
private void GetTreeviewItems(ref List<WorkFlowScriptIDDataStore> nodeList)
{
List<string> tempIDList = new List<string>();
List<string> tempPrereqList = new List<string>();
string currentID = string.Empty;
List<WorkFlowScriptIDDataStore> tempstore = new List<WorkFlowScriptIDDataStore>();
configdoc = XDocument.Load(FilePaths.appWorkflowPath + "Workflow" + ".xml");
for (int i = 0; i <= nodeList.Count; i++)
{
if (nodeList.Count > i)
{
if (nodeList.Count > 0)
{
if (nodeList[i].Id.StartsWith("TSC") ||
nodeList[i].Id.StartsWith("TSQ") || nodeList[i].Id.StartsWith("TC"))
{
foreach (XElement xe in configdoc.Descendants("TAWorkFlow"))
{
if (nodeList[i].Id == xe.Element("UniqueID").Value)
{
tempIDList = xe.Element("ScriptID").Value.Split(new char[] { ',' },
StringSplitOptions.RemoveEmptyEntries).ToList<string>();
tempPrereqList = xe.Element("Prerequisite").Value.Split(new char[] { ',' },
StringSplitOptions.RemoveEmptyEntries).ToList<string>();
break;
}
}
currentID = nodeList[i].Id;
tempIDList.Reverse();
tempPrereqList.Reverse();
int k = 0;
tempstore.Clear();
nodeList.RemoveAt(i);
foreach (string id in tempIDList)
{
tempstore.Add(new WorkFlowScriptIDDataStore());
tempstore[k].Id = id;
tempstore[k].Name = tempPrereqList[k];
tempstore[k].ParentId = currentID;
int j = i;
WorkFlowScriptIDDataList.Insert(j + 1, tempstore[k]);
nodeList.Insert(j, tempstore[k]);
j++;
k++;
}
}
}
}
}
}
感谢Ayyappan。但不幸的是,它不工作。在这里它显示为列表。在这个每个节点都有一个Parent Id。它应该属于该特定节点。 –
@AnuHardin我试过它的工作,不确定你是如何尝试的。确保正确构建WorkFlowScriptIDDataStore。它的工作, –
@ Ayyappan.This只适用于一个级别的孩子。如果一个孩子有孩子,它将无法正常工作。 –