Treeview 在不创建新父节点的情况下将子节点添加到父节点

Treeview Add Child to Parent Node Without Creating a New Parent

我的 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>

这是设置为 XAML 文件的数据上下文的 ViewModel。

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");

它很好地创建了父节点和子节点。那里没有问题。

但是,如果我使用相同的父名称但使用不同的子名称再次调用该方法;例如: AdvancedErrorCalculationViewModel.AddTreeViewItems("Parent","Child 2","Completed");

它创建了一个带有子节点 Child 2 的新父节点。因此,我有这样的东西:

- Parent
  - Child 1

- Parent
  - Child 2

我想修改这个函数,如果父节点名称相同,子节点应该属于以前的父节点而不是新的父节点。像这样:

- Parent
  - Child 1
  - Child 2

我一整天都试图在 Whosebug 上寻找解决方案,但似乎找不到适合我的问题的解决方案。谁能帮我修改我的代码以检测 Parent 节点是否已经存在于 observablecollection 中,如果存在,请将子节点放在现有父节点下?

提前致谢。 :)

将其分解为以下步骤:

  1. 搜索 treeViewObsCollection 具有 passedTopNodeName
  2. 的节点
  3. 如果失败则创建一个新节点
  4. 添加新的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));
    }