Treeview将子节点添加到父节点而不创建新父节点

时间:2015-01-22 08:42:59

标签: c# wpf mvvm treeview observablecollection

我在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中,如果存在,将子节点放在现有父节点下?

先谢谢了。 :)

1 个答案:

答案 0 :(得分:0)

将其细分为步骤:

  1. treeViewObsCollection搜索passedTopNodeName
  2. 的节点
  3. 如果失败则创建新节点
  4. 添加新的TreeViewSubItems
  5. 您可以使用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));
        }