【问题标题】:What is the best way to Iterate through a Treeview Collection to update a Numbering Scheme?迭代 Treeview 集合以更新编号方案的最佳方法是什么?
【发布时间】:2020-01-15 06:22:11
【问题描述】:

我有一个 WPF Treeview 控件,其中一个 ObservableCollection<TreeItemModel> 绑定到它的 ItemsSource

此树视图可以具有以下结构到第 n 级:

1
|-1.1
   |-1.1.1
   |-1.1.2
|-1.2
2
|-2.1
|-2.2

当一个 Item 在这个 ObservableCollection 中重新排列时,例如 2.2 移动到 1.1 下变成 1.1.3。

我如何遍历这个集合并更新每个节点上的所有数字?

【问题讨论】:

标签: c# wpf mvvm treeview


【解决方案1】:

假设您有一个具有递归树项结构的视图模型,您可以添加一个递归更新所有数字的方法:

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();
        }
    }
}

每当你调用视图模型的UpdateTreeItemNumbers()方法时,所有的数字都会被重新生成。


为了完整起见,TreeView XAML 如下所示:

<TreeView ItemsSource="{Binding TreeItems}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Number}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

【讨论】:

  • 因此有几个问题,它可以工作,但似乎没有考虑超过 2 级(需要第 n 级)当通过拖放重新排列列表时,Stackoverflows 发生在Number 属性设置 Logic foreach 循环。你知道这可能是什么问题吗?
  • 不知道,代码对我来说工作正常,你喜欢多少级别。确保在完成所有重新排列后调用一次 UpdateTreeItemNumbers 方法。
  • 是的,很抱歉,现在与您的编辑完美配合 :) 我在看到您的最新编辑之前实施了,谢谢!比我最初想象的要简单得多,我会接受作为答案
  • 对不起,还有一条评论,我仍然在 Number 的 Set 属性中遇到 Stack Overflows - 特别是 Children[i].Number = string.Format("{0}.{1}", number, i + 1);
  • 也许您在树结构中创建了循环,即一个 TreeItem 的 Children 集合包含一个元素,该元素同时是同一 TreeItem 的父级或祖父级。当然,您必须确保不会发生这种情况。
猜你喜欢
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2016-05-05
  • 2017-06-11
  • 1970-01-01
相关资源
最近更新 更多