在其他子节点列表的中间添加子节点
本文关键字:子节点 中间 添加 列表 其他 | 更新日期: 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类的一个实例(它绝对不应该是空的),事实上,您的"节点"。
如果你同意我上面所说的,我发布的插入代码应该可以工作。
请让我知道如果我可以澄清或补充这个答案,或在任何其他方面的帮助。