MobileList.xaml.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Specialized;
  4. using Xamarin.Forms;
  5. using Xamarin.Forms.Xaml;
  6. namespace InABox.Mobile
  7. {
  8. public class MobileListRefreshEventArgs : EventArgs
  9. {
  10. }
  11. public delegate void MobileListRefreshEvent(object sender, MobileListRefreshEventArgs args);
  12. [XamlCompilation(XamlCompilationOptions.Compile)]
  13. public partial class MobileList
  14. {
  15. public bool PullToRefresh
  16. {
  17. get => _refresher.IsEnabled == true;
  18. set => _refresher.IsEnabled = value;
  19. }
  20. public DataTemplate ItemTemplate
  21. {
  22. get => _list.ItemTemplate;
  23. set => _list.ItemTemplate = value;
  24. }
  25. public IEnumerable ItemsSource
  26. {
  27. get => _list.ItemsSource;
  28. set
  29. {
  30. if (_list.ItemsSource is INotifyCollectionChanged old)
  31. old.CollectionChanged -= ItemsSourceChanged;
  32. _list.ItemsSource = value;
  33. CheckChanged();
  34. if (value is INotifyCollectionChanged observable)
  35. observable.CollectionChanged += ItemsSourceChanged;
  36. }
  37. }
  38. private void ItemsSourceChanged(object sender, NotifyCollectionChangedEventArgs e)
  39. {
  40. CheckChanged();
  41. }
  42. private void CheckChanged()
  43. {
  44. //_list.IsVisible = ItemsSource?.GetEnumerator().MoveNext() == true;
  45. //_nodata.IsVisible = !_list.IsVisible;
  46. }
  47. private double _spacing;
  48. public double Spacing
  49. {
  50. get => _spacing;
  51. set
  52. {
  53. _spacing = value;
  54. var layout = _list?.ItemsLayout as LinearItemsLayout;
  55. if (layout != null)
  56. layout.ItemSpacing = _spacing;
  57. }
  58. }
  59. private bool _unevenrows;
  60. public bool HasUnevenRows
  61. {
  62. get => _unevenrows;
  63. set
  64. {
  65. _unevenrows = value;
  66. if (_list != null)
  67. _list.ItemSizingStrategy =
  68. value
  69. ? ItemSizingStrategy.MeasureAllItems
  70. : ItemSizingStrategy.MeasureFirstItem;
  71. }
  72. }
  73. public event MobileListRefreshEvent RefreshRequested;
  74. public MobileList()
  75. {
  76. InitializeComponent();
  77. _refresher.Command = new Command(DoRefresh);
  78. Spacing = 5;
  79. HasUnevenRows = true;
  80. }
  81. private void DoRefresh(object sender)
  82. {
  83. if (_refresher != null)
  84. {
  85. //var src = _list.ItemsSource;
  86. //_list.ItemsSource = null;
  87. _refresher.IsRefreshing = true;
  88. RefreshRequested?.Invoke(sender, new MobileListRefreshEventArgs());
  89. _refresher.IsRefreshing = false;
  90. //_list.ItemsSource = src;
  91. }
  92. }
  93. }
  94. }