ItemsRepeaterPageViewModel.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 RandomizeHeights()
  29. {
  30. var random = new Random();
  31. foreach (var i in Items)
  32. {
  33. i.Height = random.Next(240) + 10;
  34. }
  35. }
  36. public void ResetItems()
  37. {
  38. Items = CreateItems();
  39. }
  40. private ObservableCollection<Item> CreateItems()
  41. {
  42. var suffix = _newGenerationIndex == 0 ? string.Empty : $"[{_newGenerationIndex.ToString()}]";
  43. _newGenerationIndex++;
  44. return new ObservableCollection<Item>(
  45. Enumerable.Range(1, 100000).Select(i => new Item(i)
  46. {
  47. Text = $"Item {i.ToString()} {suffix}"
  48. }));
  49. }
  50. public class Item : ViewModelBase
  51. {
  52. private double _height = double.NaN;
  53. public Item(int index) => Index = index;
  54. public int Index { get; }
  55. public string Text { get; set; }
  56. public double Height
  57. {
  58. get => _height;
  59. set => this.RaiseAndSetIfChanged(ref _height, value);
  60. }
  61. }
  62. }
  63. }