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 DevDaysSpeakers.Services; using System.Net.Http; using Newtonsoft.Json; using System.Collections.ObjectModel; using System.Runtime.CompilerServices; namespace DevDaysSpeakers.ViewModel { public class SpeakersViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public ObservableCollection Speakers { get; set; } private bool busy; public bool IsBusy { get { return busy; } set { busy = value; OnPropertyChanged(); GetSpeakersCommand.ChangeCanExecute(); } } public Command GetSpeakersCommand { get; set; } private void OnPropertyChanged([CallerMemberName] string name = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); public SpeakersViewModel() { Speakers = new ObservableCollection(); GetSpeakersCommand = new Command( async () => await GetSpeakers(), () => !IsBusy); } private async Task GetSpeakers() { if (IsBusy) return; Exception error = null; try { IsBusy = true; using (var client = new HttpClient()) { var json = await client.GetStringAsync("http://demo4404797.mockable.io/speakers"); //Deserialize json var items = JsonConvert.DeserializeObject>(json); //Load speakers into list 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"); } } }