ListBoxPageViewModel.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.Linq;
  4. using System.Reactive;
  5. using Avalonia.Controls;
  6. using Avalonia.Controls.Selection;
  7. using ReactiveUI;
  8. namespace ControlCatalog.ViewModels
  9. {
  10. public class ListBoxPageViewModel : ReactiveObject
  11. {
  12. private bool _multiple;
  13. private bool _toggle;
  14. private bool _alwaysSelected;
  15. private bool _autoScrollToSelectedItem = true;
  16. private int _counter;
  17. private ObservableAsPropertyHelper<SelectionMode> _selectionMode;
  18. public ListBoxPageViewModel()
  19. {
  20. Items = new ObservableCollection<string>(Enumerable.Range(1, 10000).Select(i => GenerateItem()));
  21. Selection = new SelectionModel<string>();
  22. Selection.Select(1);
  23. _selectionMode = this.WhenAnyValue(
  24. x => x.Multiple,
  25. x => x.Toggle,
  26. x => x.AlwaysSelected,
  27. (m, t, a) =>
  28. (m ? SelectionMode.Multiple : 0) |
  29. (t ? SelectionMode.Toggle : 0) |
  30. (a ? SelectionMode.AlwaysSelected : 0))
  31. .ToProperty(this, x => x.SelectionMode);
  32. AddItemCommand = ReactiveCommand.Create(() => Items.Add(GenerateItem()));
  33. RemoveItemCommand = ReactiveCommand.Create(() =>
  34. {
  35. var items = Selection.SelectedItems.ToList();
  36. foreach (var item in items)
  37. {
  38. Items.Remove(item);
  39. }
  40. });
  41. SelectRandomItemCommand = ReactiveCommand.Create(() =>
  42. {
  43. var random = new Random();
  44. using (Selection.BatchUpdate())
  45. {
  46. Selection.Clear();
  47. Selection.Select(random.Next(Items.Count - 1));
  48. }
  49. });
  50. }
  51. public ObservableCollection<string> Items { get; }
  52. public SelectionModel<string> Selection { get; }
  53. public SelectionMode SelectionMode => _selectionMode.Value;
  54. public bool Multiple
  55. {
  56. get => _multiple;
  57. set => this.RaiseAndSetIfChanged(ref _multiple, value);
  58. }
  59. public bool Toggle
  60. {
  61. get => _toggle;
  62. set => this.RaiseAndSetIfChanged(ref _toggle, value);
  63. }
  64. public bool AlwaysSelected
  65. {
  66. get => _alwaysSelected;
  67. set => this.RaiseAndSetIfChanged(ref _alwaysSelected, value);
  68. }
  69. public bool AutoScrollToSelectedItem
  70. {
  71. get => _autoScrollToSelectedItem;
  72. set => this.RaiseAndSetIfChanged(ref _autoScrollToSelectedItem, value);
  73. }
  74. public ReactiveCommand<Unit, Unit> AddItemCommand { get; }
  75. public ReactiveCommand<Unit, Unit> RemoveItemCommand { get; }
  76. public ReactiveCommand<Unit, Unit> SelectRandomItemCommand { get; }
  77. private string GenerateItem() => $"Item {_counter++.ToString()}";
  78. }
  79. }