TreeViewPageViewModel.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Reactive;
  6. using Avalonia.Controls;
  7. using ReactiveUI;
  8. namespace ControlCatalog.ViewModels
  9. {
  10. public class TreeViewPageViewModel : ReactiveObject
  11. {
  12. private readonly Node _root;
  13. private SelectionMode _selectionMode;
  14. public TreeViewPageViewModel()
  15. {
  16. _root = new Node();
  17. Items = _root.Children;
  18. Selection = new SelectionModel();
  19. Selection.SelectionChanged += SelectionChanged;
  20. AddItemCommand = ReactiveCommand.Create(AddItem);
  21. RemoveItemCommand = ReactiveCommand.Create(RemoveItem);
  22. SelectRandomItemCommand = ReactiveCommand.Create(SelectRandomItem);
  23. }
  24. public ObservableCollection<Node> Items { get; }
  25. public SelectionModel Selection { get; }
  26. public ReactiveCommand<Unit, Unit> AddItemCommand { get; }
  27. public ReactiveCommand<Unit, Unit> RemoveItemCommand { get; }
  28. public ReactiveCommand<Unit, Unit> SelectRandomItemCommand { get; }
  29. public SelectionMode SelectionMode
  30. {
  31. get => _selectionMode;
  32. set
  33. {
  34. Selection.ClearSelection();
  35. this.RaiseAndSetIfChanged(ref _selectionMode, value);
  36. }
  37. }
  38. private void AddItem()
  39. {
  40. var parentItem = Selection.SelectedItems.Count > 0 ? (Node)Selection.SelectedItems[0] : _root;
  41. parentItem.AddItem();
  42. }
  43. private void RemoveItem()
  44. {
  45. while (Selection.SelectedItems.Count > 0)
  46. {
  47. Node lastItem = (Node)Selection.SelectedItems[0];
  48. RecursiveRemove(Items, lastItem);
  49. Selection.DeselectAt(Selection.SelectedIndices[0]);
  50. }
  51. bool RecursiveRemove(ObservableCollection<Node> items, Node selectedItem)
  52. {
  53. if (items.Remove(selectedItem))
  54. {
  55. return true;
  56. }
  57. foreach (Node item in items)
  58. {
  59. if (item.AreChildrenInitialized && RecursiveRemove(item.Children, selectedItem))
  60. {
  61. return true;
  62. }
  63. }
  64. return false;
  65. }
  66. }
  67. private void SelectRandomItem()
  68. {
  69. var random = new Random();
  70. var depth = random.Next(4);
  71. var indexes = Enumerable.Range(0, 4).Select(x => random.Next(10));
  72. var path = new IndexPath(indexes);
  73. Selection.SelectedIndex = path;
  74. }
  75. private void SelectionChanged(object sender, SelectionModelSelectionChangedEventArgs e)
  76. {
  77. var selected = string.Join(",", e.SelectedIndices);
  78. var deselected = string.Join(",", e.DeselectedIndices);
  79. System.Diagnostics.Debug.WriteLine($"Selected '{selected}', Deselected '{deselected}'");
  80. }
  81. public class Node
  82. {
  83. private ObservableCollection<Node> _children;
  84. private int _childIndex = 10;
  85. public Node()
  86. {
  87. Header = "Item";
  88. }
  89. public Node(Node parent, int index)
  90. {
  91. Parent = parent;
  92. Header = parent.Header + ' ' + index;
  93. }
  94. public Node Parent { get; }
  95. public string Header { get; }
  96. public bool AreChildrenInitialized => _children != null;
  97. public ObservableCollection<Node> Children => _children ??= CreateChildren();
  98. public void AddItem() => Children.Add(new Node(this, _childIndex++));
  99. public void RemoveItem(Node child) => Children.Remove(child);
  100. public override string ToString() => Header;
  101. private ObservableCollection<Node> CreateChildren()
  102. {
  103. return new ObservableCollection<Node>(
  104. Enumerable.Range(0, 10).Select(i => new Node(this, i)));
  105. }
  106. }
  107. }
  108. }