TreeViewPage.xaml.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System.Collections.ObjectModel;
  2. using System.Linq;
  3. using System.Reactive;
  4. using Avalonia.Controls;
  5. using Avalonia.Markup.Xaml;
  6. using ReactiveUI;
  7. namespace ControlCatalog.Pages
  8. {
  9. public class TreeViewPage : UserControl
  10. {
  11. public TreeViewPage()
  12. {
  13. InitializeComponent();
  14. DataContext = new PageViewModel();
  15. }
  16. private void InitializeComponent()
  17. {
  18. AvaloniaXamlLoader.Load(this);
  19. }
  20. private class PageViewModel : ReactiveObject
  21. {
  22. private SelectionMode _selectionMode;
  23. public PageViewModel()
  24. {
  25. Node root = new Node();
  26. Items = root.Children;
  27. SelectedItems = new ObservableCollection<Node>();
  28. AddItemCommand = ReactiveCommand.Create(() =>
  29. {
  30. Node parentItem = SelectedItems.Count > 0 ? SelectedItems[0] : root;
  31. parentItem.AddNewItem();
  32. });
  33. RemoveItemCommand = ReactiveCommand.Create(() =>
  34. {
  35. while (SelectedItems.Count > 0)
  36. {
  37. Node lastItem = SelectedItems[0];
  38. RecursiveRemove(Items, lastItem);
  39. SelectedItems.Remove(lastItem);
  40. }
  41. bool RecursiveRemove(ObservableCollection<Node> items, Node selectedItem)
  42. {
  43. if (items.Remove(selectedItem))
  44. {
  45. return true;
  46. }
  47. foreach (Node item in items)
  48. {
  49. if (item.AreChildrenInitialized && RecursiveRemove(item.Children, selectedItem))
  50. {
  51. return true;
  52. }
  53. }
  54. return false;
  55. }
  56. });
  57. }
  58. public ObservableCollection<Node> Items { get; }
  59. public ObservableCollection<Node> SelectedItems { get; }
  60. public ReactiveCommand<Unit, Unit> AddItemCommand { get; }
  61. public ReactiveCommand<Unit, Unit> RemoveItemCommand { get; }
  62. public SelectionMode SelectionMode
  63. {
  64. get => _selectionMode;
  65. set
  66. {
  67. SelectedItems.Clear();
  68. this.RaiseAndSetIfChanged(ref _selectionMode, value);
  69. }
  70. }
  71. }
  72. private class Node
  73. {
  74. private int _counter;
  75. private ObservableCollection<Node> _children;
  76. public string Header { get; private set; }
  77. public bool AreChildrenInitialized => _children != null;
  78. public ObservableCollection<Node> Children
  79. {
  80. get
  81. {
  82. if (_children == null)
  83. {
  84. _children = new ObservableCollection<Node>(Enumerable.Range(1, 10).Select(i => CreateNewNode()));
  85. }
  86. return _children;
  87. }
  88. }
  89. public void AddNewItem() => Children.Add(CreateNewNode());
  90. public override string ToString() => Header;
  91. private Node CreateNewNode() => new Node {Header = $"Item {_counter++}"};
  92. }
  93. }
  94. }