C# 迭代树视图集合以更新编号方案的最佳方法是什么?
我有一个WPFC# 迭代树视图集合以更新编号方案的最佳方法是什么?,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,我有一个WPFTreeview控件,其中一个observeCollection绑定到它的ItemsSource 此树视图可以具有以下第n级结构: 1 |-1.1 |-1.1.1 |-1.1.2 |-1.2 2 |-2.1 |-2.2 当项目在此可观察集合中重新排列时,例如2.2在1.1下移动,变为1.1.3 如何循环此集合并更新附加到每个节点的所有编号 假设您有一个具有递归树项结构的视图模型,您可以添加一个递归更新所有数字的方法: public class TreeItem : I
Treeview
控件,其中一个observeCollection
绑定到它的ItemsSource
此树视图可以具有以下第n级结构:
1
|-1.1
|-1.1.1
|-1.1.2
|-1.2
2
|-2.1
|-2.2
当项目在此可观察集合中重新排列时,例如2.2在1.1下移动,变为1.1.3
如何循环此集合并更新附加到每个节点的所有编号 假设您有一个具有递归树项结构的视图模型,您可以添加一个递归更新所有数字的方法:
public class TreeItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<TreeItem> Children { get; }
= new ObservableCollection<TreeItem>();
private string number;
public string Number
{
get { return number; }
set
{
if (number != value)
{
number = value;
PropertyChanged?.Invoke(
this, new PropertyChangedEventArgs(nameof(Number)));
}
for (int i = 0; i < Children.Count; i++)
{
Children[i].Number = string.Format("{0}.{1}", number, i + 1);
}
}
}
}
public class ViewModel
{
public ObservableCollection<TreeItem> TreeItems { get; }
= new ObservableCollection<TreeItem>();
public void UpdateTreeItemNumbers()
{
for (int i = 0; i < TreeItems.Count; i++)
{
TreeItems[i].Number = (i + 1).ToString();
}
}
}
请参阅以下帖子中的我的解决方案:使TrrItemModel可映射,然后使用我的CompareTo方法。因此,这有几个问题,它可以工作,但似乎没有考虑超过2级(需要第n级)的级别。当通过拖放重新排列列表时,每个循环的数字属性集逻辑中会发生堆栈溢出。你知道这可能有什么问题吗?不知道,代码对我来说很好,有你喜欢的级别。请确保在完成所有重新排列之后调用UpdateTreeItemNumbers方法一次。是的,我很抱歉,现在可以完美地处理您的编辑:)我在看到您的最新编辑之前实现了,谢谢!比我最初想象的要简单得多,我将接受一个进一步的评论作为回答。对不起,我仍然在Number的Set属性中遇到堆栈溢出——特别是Children[i].Number=string.Format(“{0}.{1}”,Number,i+1);可能您已经在树结构中创建了循环,即一个TreeItem的Children集合包含一个元素,该元素同时是同一TreeItem的父级或祖级。当然,你必须确保这不会发生。
<TreeView ItemsSource="{Binding TreeItems}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Number}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>