PlaygroundPageViewModel.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.Linq;
  4. using Avalonia;
  5. using Avalonia.Controls;
  6. using Avalonia.Controls.Selection;
  7. using MiniMvvm;
  8. namespace VirtualizationDemo.ViewModels;
  9. public class PlaygroundPageViewModel : ViewModelBase
  10. {
  11. private SelectionMode _selectionMode = SelectionMode.Multiple;
  12. private int _scrollToIndex = 500;
  13. private string? _newItemHeader = "New Item 1";
  14. public PlaygroundPageViewModel()
  15. {
  16. Items = new(Enumerable.Range(0, 1000).Select(x => new PlaygroundItemViewModel(x)));
  17. Selection = new();
  18. }
  19. public ObservableCollection<PlaygroundItemViewModel> Items { get; }
  20. public bool Multiple
  21. {
  22. get => _selectionMode.HasFlag(SelectionMode.Multiple);
  23. set => SetSelectionMode(SelectionMode.Multiple, value);
  24. }
  25. public bool Toggle
  26. {
  27. get => _selectionMode.HasFlag(SelectionMode.Toggle);
  28. set => SetSelectionMode(SelectionMode.Toggle, value);
  29. }
  30. public bool AlwaysSelected
  31. {
  32. get => _selectionMode.HasFlag(SelectionMode.AlwaysSelected);
  33. set => SetSelectionMode(SelectionMode.AlwaysSelected, value);
  34. }
  35. public SelectionModel<PlaygroundItemViewModel> Selection { get; }
  36. public SelectionMode SelectionMode
  37. {
  38. get => _selectionMode;
  39. set => RaiseAndSetIfChanged(ref _selectionMode, value);
  40. }
  41. public int ScrollToIndex
  42. {
  43. get => _scrollToIndex;
  44. set => RaiseAndSetIfChanged(ref _scrollToIndex, value);
  45. }
  46. public string? NewItemHeader
  47. {
  48. get => _newItemHeader;
  49. set => RaiseAndSetIfChanged(ref _newItemHeader, value);
  50. }
  51. public void ExecuteScrollToIndex()
  52. {
  53. Selection.Select(ScrollToIndex);
  54. }
  55. public void RandomizeScrollToIndex()
  56. {
  57. var rnd = new Random();
  58. ScrollToIndex = rnd.Next(Items.Count);
  59. }
  60. public void AddAtSelectedIndex()
  61. {
  62. if (Selection.SelectedIndex == -1)
  63. return;
  64. Items.Insert(Selection.SelectedIndex, new(NewItemHeader));
  65. }
  66. public void DeleteSelectedItem()
  67. {
  68. var count = Selection.Count;
  69. for (var i = count - 1; i >= 0; i--)
  70. Items.RemoveAt(Selection.SelectedIndexes[i]);
  71. }
  72. private void SetSelectionMode(SelectionMode mode, bool value)
  73. {
  74. if (value)
  75. SelectionMode |= mode;
  76. else
  77. SelectionMode &= ~mode;
  78. }
  79. }