ItemsRepeaterPageViewModel.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.Linq;
  4. using Avalonia.Media;
  5. using MiniMvvm;
  6. namespace ControlCatalog.ViewModels
  7. {
  8. public class ItemsRepeaterPageViewModel : ViewModelBase
  9. {
  10. private int _newItemIndex = 1;
  11. private int _newGenerationIndex = 0;
  12. private ObservableCollection<Item> _items;
  13. public ItemsRepeaterPageViewModel()
  14. {
  15. Items = CreateItems();
  16. }
  17. public ObservableCollection<Item> Items
  18. {
  19. get => _items;
  20. set => this.RaiseAndSetIfChanged(ref _items, value);
  21. }
  22. public Item SelectedItem { get; set; }
  23. public void AddItem()
  24. {
  25. var index = SelectedItem != null ? Items.IndexOf(SelectedItem) : -1;
  26. Items.Insert(index + 1, new Item(index + 1) { Text = $"New Item {_newItemIndex++}" });
  27. }
  28. public void RemoveItem()
  29. {
  30. if (SelectedItem is not null)
  31. {
  32. Items.Remove(SelectedItem);
  33. SelectedItem = null;
  34. }
  35. else if (Items.Count > 0)
  36. {
  37. Items.RemoveAt(Items.Count - 1);
  38. }
  39. }
  40. public void RandomizeHeights()
  41. {
  42. var random = new Random();
  43. foreach (var i in Items)
  44. {
  45. i.Height = random.Next(240) + 10;
  46. }
  47. }
  48. public void ResetItems()
  49. {
  50. Items = CreateItems();
  51. }
  52. private ObservableCollection<Item> CreateItems()
  53. {
  54. var suffix = _newGenerationIndex == 0 ? string.Empty : $"[{_newGenerationIndex.ToString()}]";
  55. _newGenerationIndex++;
  56. return new ObservableCollection<Item>(
  57. Enumerable.Range(1, 100000).Select(i => new Item(i)
  58. {
  59. Text = $"Item {i.ToString()} {suffix}"
  60. }));
  61. }
  62. public class Item : ViewModelBase
  63. {
  64. private double _height = double.NaN;
  65. public Item(int index) => Index = index;
  66. public int Index { get; }
  67. public string Text { get; set; }
  68. public double Height
  69. {
  70. get => _height;
  71. set => this.RaiseAndSetIfChanged(ref _height, value);
  72. }
  73. }
  74. }
  75. }