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 中,如果存在,请将子节点放在现有父节点下?
提前致谢。 :)
将其分解为以下步骤:
- 搜索
treeViewObsCollection
具有 passedTopNodeName
的节点
- 如果失败则创建一个新节点
- 添加新的
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));
}
我的 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 中,如果存在,请将子节点放在现有父节点下?
提前致谢。 :)
将其分解为以下步骤:
- 搜索
treeViewObsCollection
具有passedTopNodeName
的节点
- 如果失败则创建一个新节点
- 添加新的
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));
}