ItemsRepeaterPageViewModel.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.Linq;
  4. using Avalonia.Media;
  5. using ReactiveUI;
  6. namespace ControlCatalog.ViewModels
  7. {
  8. public class ItemsRepeaterPageViewModel : ReactiveObject
  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 : ReactiveObject
  51. {
  52. private double _height = double.NaN;
  53. private int _index;
  54. public Item(int index)
  55. {
  56. _index = index;
  57. }
  58. public string Text { get; set; }
  59. public double Height
  60. {
  61. get => _height;
  62. set => this.RaiseAndSetIfChanged(ref _height, value);
  63. }
  64. public IBrush Background => ((_index % 2) == 0) ? Brushes.Yellow : Brushes.Wheat;
  65. }
  66. }
  67. }