【问题标题】:Treeview Add Child to Parent Node Without Creating a New Parent树视图将子节点添加到父节点而不创建新父节点
【发布时间】:2015-03-20 23:38:40
【问题描述】:

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

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

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

它使用子节点 Child 2 创建一个新的父节点。因此,我有这样的事情:

- Parent
  - Child 1

- Parent
  - Child 2

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

- Parent
  - Child 1
  - Child 2

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

谢谢提前。 :)

【问题讨论】:

    标签: c# wpf mvvm treeview observablecollection


    【解决方案1】:

    把它分解成几个步骤:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 2013-04-16
      相关资源
      最近更新 更多