using System; using System.Collections.Specialized; using Foundation; using UIKit; namespace ezxamairn.iOS { public partial class BrowseViewController : UITableViewController { UIRefreshControl refreshControl; public ItemsViewModel ViewModel { get; set; } public BrowseViewController(IntPtr handle) : base(handle) { } public override void ViewDidLoad() { base.ViewDidLoad(); ViewModel = new ItemsViewModel(); // Setup UITableView. refreshControl = new UIRefreshControl(); refreshControl.ValueChanged += RefreshControl_ValueChanged; TableView.Add(refreshControl); TableView.Source = new ItemsDataSource(ViewModel); Title = ViewModel.Title; ViewModel.PropertyChanged += IsBusy_PropertyChanged; ViewModel.Items.CollectionChanged += Items_CollectionChanged; } public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); if (ViewModel.Items.Count == 0) ViewModel.LoadItemsCommand.Execute(null); } public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) { if (segue.Identifier == "NavigateToItemDetailSegue") { var controller = segue.DestinationViewController as BrowseItemDetailViewController; var indexPath = TableView.IndexPathForCell(sender as UITableViewCell); var item = ViewModel.Items[indexPath.Row]; controller.ViewModel = new ItemDetailViewModel(item); } else { var controller = segue.DestinationViewController as ItemNewViewController; controller.ViewModel = ViewModel; } } void RefreshControl_ValueChanged(object sender, EventArgs e) { if (!ViewModel.IsBusy && refreshControl.Refreshing) ViewModel.LoadItemsCommand.Execute(null); } void IsBusy_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { var propertyName = e.PropertyName; switch (propertyName) { case nameof(ViewModel.IsBusy): { InvokeOnMainThread(() => { if (ViewModel.IsBusy && !refreshControl.Refreshing) refreshControl.BeginRefreshing(); else if (!ViewModel.IsBusy) refreshControl.EndRefreshing(); }); } break; } } void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { InvokeOnMainThread(() => TableView.ReloadData()); } } class ItemsDataSource : UITableViewSource { static readonly NSString CELL_IDENTIFIER = new NSString("ITEM_CELL"); ItemsViewModel viewModel; public ItemsDataSource(ItemsViewModel viewModel) { this.viewModel = viewModel; } public override nint RowsInSection(UITableView tableview, nint section) => viewModel.Items.Count; public override nint NumberOfSections(UITableView tableView) => 1; public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) { var cell = tableView.DequeueReusableCell(CELL_IDENTIFIER, indexPath); var item = viewModel.Items[indexPath.Row]; cell.TextLabel.Text = item.Text; cell.DetailTextLabel.Text = item.Description; cell.LayoutMargins = UIEdgeInsets.Zero; return cell; } } }