Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 迭代树视图集合以更新编号方案的最佳方法是什么?_C#_Wpf_Mvvm_Treeview - Fatal编程技术网

C# 迭代树视图集合以更新编号方案的最佳方法是什么?

C# 迭代树视图集合以更新编号方案的最佳方法是什么?,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

我有一个WPF
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>