MobileMenuButtonMenuViewModel.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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 bool ShowImages { get; set; }
  26. public MobileMenuButtonMenuImagePosition ImagePosition { get; set; }
  27. public MobileMenuButtonMenuViewModel()
  28. {
  29. _items = new ObservableCollection<MobileMenuEntry>();
  30. _visibleItems = new ObservableCollection<MobileMenuEntry>();
  31. _items.CollectionChanged += (sender, args) =>
  32. {
  33. DoLayout();
  34. };
  35. }
  36. private void DoLayout()
  37. {
  38. VisibleItems.Clear();
  39. int iRow = 0;
  40. foreach (var item in Items.Where(x => x.IsVisible))
  41. {
  42. item.Index = iRow;
  43. item.VisibleChanged = DoLayout;
  44. item.AfterClick = () => ItemClicked?.Invoke(this, EventArgs.Empty);
  45. VisibleItems.Add(item);
  46. iRow++;
  47. }
  48. LayoutChanged?.Invoke(this,new MobileMenuButtonLayoutChangedEventArgs(iRow));
  49. }
  50. }
  51. }