1
0

ItemsRepeaterPageViewModel.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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<ItemsRepeaterPageViewModelItem> _items;
  13. public ItemsRepeaterPageViewModel()
  14. {
  15. _items = CreateItems();
  16. }
  17. public ObservableCollection<ItemsRepeaterPageViewModelItem> Items
  18. {
  19. get => _items;
  20. set => this.RaiseAndSetIfChanged(ref _items, value);
  21. }
  22. public ItemsRepeaterPageViewModelItem? SelectedItem { get; set; }
  23. public void AddItem()
  24. {
  25. var index = SelectedItem != null ? Items.IndexOf(SelectedItem) : -1;
  26. Items.Insert(index + 1, new ItemsRepeaterPageViewModelItem(index + 1, $"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<ItemsRepeaterPageViewModelItem> CreateItems()
  53. {
  54. var suffix = _newGenerationIndex == 0 ? string.Empty : $"[{_newGenerationIndex.ToString()}]";
  55. _newGenerationIndex++;
  56. return new ObservableCollection<ItemsRepeaterPageViewModelItem>(
  57. Enumerable.Range(1, 100000).Select(i => new ItemsRepeaterPageViewModelItem(i, $"Item {i.ToString()} {suffix}")));
  58. }
  59. }
  60. public class ItemsRepeaterPageViewModelItem : ViewModelBase
  61. {
  62. private double _height = double.NaN;
  63. public ItemsRepeaterPageViewModelItem(int index, string text)
  64. {
  65. Index = index;
  66. Text = text;
  67. }
  68. public int Index { get; }
  69. public string Text { get; }
  70. public double Height
  71. {
  72. get => _height;
  73. set => this.RaiseAndSetIfChanged(ref _height, value);
  74. }
  75. }
  76. }