123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- using System;
- using System.Collections.ObjectModel;
- using System.Linq;
- using System.Reactive;
- using Avalonia.Controls;
- using MiniMvvm;
- namespace ControlCatalog.ViewModels
- {
- public class TreeViewPageViewModel : ViewModelBase
- {
- private readonly Node _root;
- private SelectionMode _selectionMode;
- public TreeViewPageViewModel()
- {
- _root = new Node();
- Items = _root.Children;
- SelectedItems = new ObservableCollection<Node>();
- AddItemCommand = MiniCommand.Create(AddItem);
- RemoveItemCommand = MiniCommand.Create(RemoveItem);
- SelectRandomItemCommand = MiniCommand.Create(SelectRandomItem);
- }
- public ObservableCollection<Node> Items { get; }
- public ObservableCollection<Node> SelectedItems { get; }
- public MiniCommand AddItemCommand { get; }
- public MiniCommand RemoveItemCommand { get; }
- public MiniCommand SelectRandomItemCommand { get; }
- public SelectionMode SelectionMode
- {
- get => _selectionMode;
- set
- {
- SelectedItems.Clear();
- this.RaiseAndSetIfChanged(ref _selectionMode, value);
- }
- }
- private void AddItem()
- {
- var parentItem = SelectedItems.Count > 0 ? (Node)SelectedItems[0] : _root;
- parentItem.AddItem();
- }
- private void RemoveItem()
- {
- while (SelectedItems.Count > 0)
- {
- Node lastItem = (Node)SelectedItems[0];
- RecursiveRemove(Items, lastItem);
- SelectedItems.RemoveAt(0);
- }
- bool RecursiveRemove(ObservableCollection<Node> items, Node selectedItem)
- {
- if (items.Remove(selectedItem))
- {
- return true;
- }
- foreach (Node item in items)
- {
- if (item.AreChildrenInitialized && RecursiveRemove(item.Children, selectedItem))
- {
- return true;
- }
- }
- return false;
- }
- }
- private void SelectRandomItem()
- {
- var random = new Random();
- var depth = random.Next(4);
- var indexes = Enumerable.Range(0, depth).Select(x => random.Next(10));
- var node = _root;
- foreach (var i in indexes)
- {
- node = node.Children[i];
- }
- SelectedItems.Clear();
- SelectedItems.Add(node);
- }
- public class Node
- {
- private ObservableCollection<Node>? _children;
- private int _childIndex = 10;
- public Node()
- {
- Header = "Item";
- }
- public Node(Node parent, int index)
- {
- Parent = parent;
- Header = parent.Header + ' ' + index;
- }
- public Node? Parent { get; }
- public string Header { get; }
- public bool AreChildrenInitialized => _children != null;
- public ObservableCollection<Node> Children => _children ??= CreateChildren();
- public void AddItem() => Children.Add(new Node(this, _childIndex++));
- public void RemoveItem(Node child) => Children.Remove(child);
- public override string ToString() => Header;
- private ObservableCollection<Node> CreateChildren()
- {
- return new ObservableCollection<Node>(
- Enumerable.Range(0, 10).Select(i => new Node(this, i)));
- }
- }
- }
- }
|