MobileList.xaml.cs 3.3 KB

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