瀏覽代碼

SpeakersViewModel Binding
SpeakersPage DetailsPage View
Speaker.cs Model

Sylvrec 9 年之前
父節點
當前提交
bfb83be995

+ 6 - 1
HandsOnLab/Start/DevDaysSpeakers/DevDaysSpeakers.Shared/Model/Speaker.cs

@@ -9,7 +9,12 @@ namespace DevDaysSpeakers.Model
     public class Speaker
     {
         //Add speaker attributes here
-
+        public string Id { get; set; }
+        public string Name { get; set; }
+        public string Description { get; set; }
+        public string Website { get; set; }
+        public string Title { get; set; }
+        public string Avatar { get; set; }
 
         //Azure information for version
         [Microsoft.WindowsAzure.MobileServices.Version]

+ 10 - 0
HandsOnLab/Start/DevDaysSpeakers/DevDaysSpeakers.Shared/View/DetailsPage.xaml

@@ -3,5 +3,15 @@
              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
              x:Class="DevDaysSpeakers.View.DetailsPage"
              Title="Details">
+  <ScrollView Padding="10">
+    <StackLayout Spacing="10">
+      <Image Source="{Binding Avatar}" HeightRequest="200" WidthRequest="200"/>
 
+      <Label Text="{Binding Name}" FontSize="24"/>
+      <Label Text="{Binding Title}" TextColor="Purple"/>
+      <Label Text="{Binding Description}"/>
+      <Button Text="Speak" x:Name="ButtonSpeak"/>
+      <Button Text="Go to Website" x:Name="ButtonWebsite"/>
+    </StackLayout>
+  </ScrollView>
 </ContentPage>

+ 11 - 1
HandsOnLab/Start/DevDaysSpeakers/DevDaysSpeakers.Shared/View/DetailsPage.xaml.cs

@@ -23,7 +23,17 @@ namespace DevDaysSpeakers.View
             //Set local instance of speaker and set BindingContext
             this.speaker = speaker;
             BindingContext = this.speaker;
+            ButtonSpeak.Clicked += ButtonSpeak_Clicked;
+            ButtonWebsite.Clicked += ButtonWebsite_Clicked;
+        }
+        private void ButtonSpeak_Clicked(object sender, EventArgs e)
+        {
+            CrossTextToSpeech.Current.Speak(this.speaker.Description);
+        }
+        private void ButtonWebsite_Clicked(object sender, EventArgs e)
+        {
+            if (speaker.Website.StartsWith("http"))
+                Device.OpenUri(new Uri(speaker.Website));
         }
-        
     }
 }

+ 15 - 2
HandsOnLab/Start/DevDaysSpeakers/DevDaysSpeakers.Shared/View/SpeakersPage.xaml

@@ -3,5 +3,18 @@
              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
              x:Class="DevDaysSpeakers.View.SpeakersPage"
              Title="Speakers">
-
-</ContentPage>
+             <StackLayout Spacing="0">
+               <Button Text="Sync Speakers" Command="{Binding GetSpeakersCommand}"/>
+               <ActivityIndicator IsRunning="{Binding IsBusy}" IsVisible="{Binding IsBusy}"/>
+               <ListView x:Name="ListViewSpeakers"
+              ItemsSource="{Binding Speakers}">
+              <ListView.ItemTemplate>
+                <DataTemplate>
+                    <ImageCell Text="{Binding Name}"
+                                Detail="{Binding Title}"
+                                ImageSource="{Binding Avatar}"/>
+                </DataTemplate>
+              </ListView.ItemTemplate>
+              </ListView>
+             </StackLayout>
+</ContentPage>

+ 11 - 1
HandsOnLab/Start/DevDaysSpeakers/DevDaysSpeakers.Shared/View/SpeakersPage.xaml.cs

@@ -22,8 +22,18 @@ namespace DevDaysSpeakers.View
             //Create the view model and set as binding context
             vm = new SpeakersViewModel();
             BindingContext = vm;
+            ListViewSpeakers.ItemSelected += ListViewSpeakers_ItemSelected;
         }
 
-       
+        private async void ListViewSpeakers_ItemSelected(object sender, SelectedItemChangedEventArgs e)
+        {
+            var speaker = e.SelectedItem as Speaker;
+            if (speaker == null)
+                return;
+
+            await Navigation.PushAsync(new DetailsPage(speaker));
+
+            ListViewSpeakers.SelectedItem = null;
+        }
     }
 }

+ 63 - 1
HandsOnLab/Start/DevDaysSpeakers/DevDaysSpeakers.Shared/ViewModel/SpeakersViewModel.cs

@@ -16,7 +16,69 @@ using System.Runtime.CompilerServices;
 
 namespace DevDaysSpeakers.ViewModel
 {
-    public class SpeakersViewModel
+    public class SpeakersViewModel : INotifyPropertyChanged
     {
+        public event PropertyChangedEventHandler PropertyChanged;
+
+        public ObservableCollection<Speaker> 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<Speaker>();
+            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<List<Speaker>>(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");
+        }
     }
 }