MobileMenuButtonMenuViewModel.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using Xamarin.Forms;
  6. namespace InABox.Mobile
  7. {
  8. public class MobileMenuButtonLayoutChangedEventArgs : EventArgs
  9. {
  10. public int RowCount { get; private set; }
  11. public MobileMenuButtonLayoutChangedEventArgs(int rowcount)
  12. {
  13. RowCount = rowcount;
  14. }
  15. }
  16. public delegate void MobileMenuButtonLayoutChangedEvent(object sender, MobileMenuButtonLayoutChangedEventArgs args);
  17. public class MobileMenuButtonMenuViewModel : BindableObject
  18. {
  19. private readonly ObservableCollection<MobileMenuEntry> _items;
  20. public IList<MobileMenuEntry> Items => _items;
  21. private readonly ObservableCollection<MobileMenuEntry> _visibleItems;
  22. public IList<MobileMenuEntry> VisibleItems => _visibleItems;
  23. public event MobileMenuButtonLayoutChangedEvent LayoutChanged;
  24. public event EventHandler ItemClicked;
  25. public MobileMenuButtonMenuViewModel()
  26. {
  27. _items = new ObservableCollection<MobileMenuEntry>();
  28. _visibleItems = new ObservableCollection<MobileMenuEntry>();
  29. _items.CollectionChanged += (sender, args) =>
  30. {
  31. DoLayout();
  32. };
  33. }
  34. private void DoLayout()
  35. {
  36. VisibleItems.Clear();
  37. int iRow = 0;
  38. foreach (var item in Items.Where(x => x.IsVisible))
  39. {
  40. item.Index = iRow;
  41. item.VisibleChanged = DoLayout;
  42. item.AfterClick = () => ItemClicked?.Invoke(this, EventArgs.Empty);
  43. VisibleItems.Add(item);
  44. iRow++;
  45. }
  46. LayoutChanged?.Invoke(this,new MobileMenuButtonLayoutChangedEventArgs(iRow));
  47. }
  48. }
  49. }