我在XAML中使用HierarchicalDataTemplate进行树视图设置,如下所示:
<TreeView Grid.Column="1" Grid.Row="0" ItemsSource="{Binding treeViewObsCollection}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding mainNodes}">
<TextBlock Text="{Binding topNodeName}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding subItemName}"></TextBlock>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
这是ViewModel,它被设置为XAML文件的数据上下文。
class AdvancedErrorCalculationViewModel : ViewModelBase
{
static ObservableCollection<TreeViewClass> _treeViewObsCollection = new ObservableCollection<TreeViewClass>();
public static ObservableCollection<TreeViewClass> treeViewObsCollection { get { return _treeViewObsCollection; } }
public class TreeViewClass : ViewModelBase
{
public TreeViewClass(string passedTopNodeName)
{
topNodeName = passedTopNodeName;
mainNodes = new ObservableCollection<TreeViewSubItems>();
}
public string topNodeName
{
get { return this.GetValue<string>(); }
set { this.SetValue(value); }
}
public ObservableCollection<TreeViewSubItems> mainNodes { get; private set; }
}
public class TreeViewSubItems : ViewModelBase
{
public TreeViewSubItems(string passedSubItemName, string passedSubItemJobStatus)
{
subItemName = passedSubItemName;
subItemJobStatus = passedSubItemJobStatus;
}
public string subItemName
{
get { return this.GetValue<string>(); }
set { this.SetValue(value); }
}
public string subItemJobStatus
{
get { return this.GetValue<string>(); }
set { this.SetValue(value); }
}
}
public static void AddTreeViewItems(string passedTopNodeName, string passedChildItemName, string passedChildItemJobStatus)
{
treeViewObsCollection.Add(new TreeViewClass(passedTopNodeName)
{
mainNodes =
{
new TreeViewSubItems(passedChildItemName, passedChildItemJobStatus)
}
});
}
}
问题在于上面提到的AddTreeViewItems
方法。目前,如果我通过以下方式调用该方法:
AdvancedErrorCalculationViewModel.AddTreeViewItems("Parent","Child 1", "Completed");
它可以很好地创建父节点和子节点。没问题。
但是,如果我再次使用相同的父名称调用该方法,但使用不同的Child;例如: AdvancedErrorCalculationViewModel.AddTreeViewItems(&#34; Parent&#34;,&#34; Child 2&#34;,&#34; Completed&#34;);
它创建一个带有子节点Child 2的新父节点。因此,我有这样的事情:
- Parent
- Child 1
- Parent
- Child 2
我想修改此函数,以便如果父名称相同,则子节点应属于前一个Parent而不是新的Parent节点。像这样:
- Parent
- Child 1
- Child 2
我试图在stackoverflow上寻找一整天的解决方案,但似乎无法找到适合我的问题。任何人都可以帮我修改我的代码以检测父节点是否已经存在于observablecollection中,如果存在,将子节点放在现有父节点下?
先谢谢了。 :)
答案 0 :(得分:0)
将其细分为步骤:
treeViewObsCollection
搜索passedTopNodeName
TreeViewSubItems
您可以使用LINQ:
public static void AddTreeViewItems(string passedTopNodeName, string passedChildItemName, string passedChildItemJobStatus)
{
TreeViewClass topNode = treeViewObsCollection.FirstOrDefault(x => x.topNodeName == passedTopNodeName);
if (topNode == null)
{
topNode = new TreeViewClass(passedTopNodeName);
treeViewObsCollection.Add(topNode);
}
topNode.mainNodes.Add(new TreeViewSubItems(passedChildItemName, passedChildItemJobStatus));
}