using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using Xamarin.Forms; using DevDaysSpeakers.Model; using System.Net.Http; using Newtonsoft.Json; using System.Collections.ObjectModel; using System.Runtime.CompilerServices; using DevDaysSpeakers.Services; namespace DevDaysSpeakers.ViewModel { public class SpeakersViewModel : INotifyPropertyChanged { public ObservableCollection Speakers { get; set; } public Command GetSpeakersCommand { get; set; } public SpeakersViewModel() { Speakers = new ObservableCollection(); GetSpeakersCommand = new Command( async () => await GetSpeakers(), () => !IsBusy); } bool busy; public bool IsBusy { get { return busy; } set { busy = value; OnPropertyChanged(); GetSpeakersCommand.ChangeCanExecute(); } } async Task GetSpeakers() { if (IsBusy) return; Exception error = null; try { IsBusy = true; var service = DependencyService.Get(); var items = await service.GetSpeakers(); Speakers.Clear(); foreach (var item in items) Speakers.Add(item); } catch (Exception ex) { Debug.WriteLine("Error: " + ex); error = ex; } finally { IsBusy = false; } if (error != null) await Application.Current.MainPage.DisplayAlert("Error!", error.Message, "OK"); } public event PropertyChangedEventHandler PropertyChanged; void OnPropertyChanged([CallerMemberName] string name = null) { var changed = PropertyChanged; if (changed == null) return; changed.Invoke(this, new PropertyChangedEventArgs(name)); } } }