ListBoxPageViewModel.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 MiniMvvm;
  8. namespace ControlCatalog.ViewModels
  9. {
  10. public class ListBoxPageViewModel : ViewModelBase
  11. {
  12. private bool _multiple;
  13. private bool _toggle;
  14. private bool _alwaysSelected;
  15. private bool _autoScrollToSelectedItem = true;
  16. private int _counter;
  17. private IObservable<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 ? Avalonia.Controls.SelectionMode.Multiple : 0) |
  29. (t ? Avalonia.Controls.SelectionMode.Toggle : 0) |
  30. (a ? Avalonia.Controls.SelectionMode.AlwaysSelected : 0));
  31. AddItemCommand = MiniCommand.Create(() => Items.Add(GenerateItem()));
  32. RemoveItemCommand = MiniCommand.Create(() =>
  33. {
  34. var items = Selection.SelectedItems.ToList();
  35. foreach (var item in items)
  36. {
  37. Items.Remove(item);
  38. }
  39. });
  40. SelectRandomItemCommand = MiniCommand.Create(() =>
  41. {
  42. var random = new Random();
  43. using (Selection.BatchUpdate())
  44. {
  45. Selection.Clear();
  46. Selection.Select(random.Next(Items.Count - 1));
  47. }
  48. });
  49. }
  50. public ObservableCollection<string> Items { get; }
  51. public SelectionModel<string> Selection { get; }
  52. public IObservable<SelectionMode> SelectionMode => _selectionMode;
  53. public bool Multiple
  54. {
  55. get => _multiple;
  56. set => this.RaiseAndSetIfChanged(ref _multiple, value);
  57. }
  58. public bool Toggle
  59. {
  60. get => _toggle;
  61. set => this.RaiseAndSetIfChanged(ref _toggle, value);
  62. }
  63. public bool AlwaysSelected
  64. {
  65. get => _alwaysSelected;
  66. set => this.RaiseAndSetIfChanged(ref _alwaysSelected, value);
  67. }
  68. public bool AutoScrollToSelectedItem
  69. {
  70. get => _autoScrollToSelectedItem;
  71. set => this.RaiseAndSetIfChanged(ref _autoScrollToSelectedItem, value);
  72. }
  73. public MiniCommand AddItemCommand { get; }
  74. public MiniCommand RemoveItemCommand { get; }
  75. public MiniCommand SelectRandomItemCommand { get; }
  76. private string GenerateItem() => $"Item {_counter++.ToString()}";
  77. }
  78. }