在其他子节点列表的中间添加子节点

本文关键字:子节点 中间 添加 列表 其他 | 更新日期: 2023-09-27 17:49:17

这个问题是这个问题的后续问题。基本上我要做的就是按数字顺序给treeView添加节点。现在我正在处理一个子节点列表。每个子节点都有一个数值的DisplayName。在我的程序中,我有一个循环,检查正在添加的节点的DisplayName是否小于循环中当前子节点的DisplayName。如果新子节点的DisplayName小于被检查的子节点,我想在已经存在的节点之前添加新节点。我很难想出一个方法来做这件事。

下面是我的代码:
var node = Data.GetAllChildren(x => x.Children).Distinct().ToList().First(x => x.identify == 'B');
//Get # of children -- if children exist
if (node.Children.Count() > 0)
{
    newChildTitle = int.Parse(nodeName.Value); //node to add
    for (int i = 0; i < node.Children.Count(); i++)
    {
        currentChildTitle = int.Parse(node.Children.ElementAt(i).DisplayName.Value); //current node value
        if (newChildTitle == currentChildTitle) //Check if location already exists
        {
            MessageBox.Show("Sorry, that location name already exists under this category.", "Duplicate Location Name", MessageBoxButton.OK, MessageBoxImage.Warning);
            break;
        }
        else if (newChildTitle < currentChildTitle) //If new location value is less, add before current location in Tree
        {
            //CODE WOULD GO HERE**        
            break;
        }
    }
}
else //if no children exist, just add
    node.Children.Add(CreateBlockingLocation(model, blockTreeCollection, nodeName));

TreeView的XAML (TreeView绑定到ObservableCollection):

<!-- Tree view items & Functions -->
    <TreeView Name="Tree_One" IsEnabled="{Binding DataContext.DataTreeEnabled, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" ItemsSource="{Binding DataTree.Data}" />

TreeView绑定的ObservableCollection<HierarchicalVM>的数据和属性:

private HierarchicalVM _parent;
private ObservableCollection<HierarchicalVM> _children;
public HierarchicalVM()
{
    Commands = new ObservableCollection<Command>();
}
//Relationship Properties
public HierarchicalVM Parent
{
    get { return _parent; }
    set
    {
        _parent = value;
        NotifyPropertyChange(() => Parent);
    }
}
public ObservableCollection<HierarchicalVM> Children
{
   get { return _children ?? (_children = new ObservableCollection<HierarchicalVM>()); }
   set { _children = value; }
}

当前解决方案尝试:

//Gets parent item (Data is the complete Tree)
var node = Data.GetAllChildren(x => x.Children).Distinct().ToList().First(x => x.identify == 'B'); 
if (!node.Children.Any(n => n.numValue == newNumValue))
{
    //Error is on this line: **Operator '.' cannot be applied to operand of type 'void'
    node.Children = node.Children.Add(newNode).Orderby(n => n.numValue);
}

在其他子节点列表的中间添加子节点

好,假设您已经有了对Parent对象(而不是DataTreeItem UI Element)的引用,我可以想到有两种方法来完成此操作。这是我在MSDN上进行了一些检查后的结果,所以我为任何错误道歉。

Parent parent = //however you are getting the parent
if (!parent.Children.Any(n => n.DisplayName == newNode.DisplayName))
{
   parent.Children.Add(newNode)
   parent.Children = new ObservableCollection<ViewModel>(parent.Children.OrderBy(n => n.DisplayName));
   //OR,
   parent.Children.InsertItem(parent.Children.IndexOf(parent.Children.OrderBy(n => n.DisplayName).Last(n => n.DisplayName < newNode.DisplayName)), newNode);
}

第一个方法只是添加新项并使用列表,这与就地插入得到的结果相同。第二种方法实际上是就地插入,但更复杂,因为必须找到要插入的索引。

如果列表已经排序,则可以在第二种方法中删除OrderBy。这也假设DisplayName是一个int和每个子节点的属性(从你发布的代码它不是,但它应该是)。

显然我不理解你的架构,所以我将解释我认为它应该是怎样的,然后也许你可以发现你的代码在哪里坏了。

有一个对象类型Parent,它包含一个名为children的集合,如下所示:

class Parent<T>
{
   ObservableCollection<T> Children;
}

现在我们在视图模型中有一个名为Data的Parent集合,TreeView被绑定到这个集合上。不知何故,我们得到了这个Parent类的一个实例(它绝对不应该是空的),事实上,您的"节点"。

如果你同意我上面所说的,我发布的插入代码应该可以工作。

请让我知道如果我可以澄清或补充这个答案,或在任何其他方面的帮助。