ItemsRepeaterPageViewModel.cs 1.9 KB

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