简体   繁体   中英

What is the best way to Iterate through a Treeview Collection to update a Numbering Scheme?

I have a WPF Treeview control with an ObservableCollection<TreeItemModel> binded to its ItemsSource

This treeview can have the following structure to the n'th Level:

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

When an Item is re-arranged in this ObservableCollection, eg 2.2 is moved under 1.1 to become 1.1.3.

How do i loop through this collection and update all of the numbers attached to each node?

Assuming you have a view model with a recursive tree item structure, you may add a method that recursively updates all numbers:

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

Whenever you call the UpdateTreeItemNumbers() method of the view model, all numbers will be regenerated.


For completeness, the TreeView XAML would look like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM