title: Binding to Xamarin Picker SelectedItem in XAML not Reloading Form
body: <p>I'm having some difficulty in Binding my Xamarin Picker so that when I change the selected item, it triggers a refresh in my form. I'm using XAML with code-behind.</p>
  
  <p>Here is the XAML. You can see the Picker defined. The data is being bound to that nicely and it is loading the Name property from my List.</p>
  
  <p>There is an Id "Entry" field above it, and this is the part that isn't working. What I'd like that to do is display the Id field from the List/selected list item when the picker has been "picked". </p>
  
  <p>There is also some sample code I found online which works - Surname and Forename are both updating he corresponding label when data is entered. So it must be something to do with the picker and the SelectedItem binding or the way I am trying to use OnPropertyChanged.</p>
  
  <pre><code>&lt;ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="TechsportiseApp.MainUI.Races"&gt;
    &lt;StackLayout Padding="0,20,0,0"&gt;
      &lt;Label Text="Race ID" /&gt;
      &lt;Entry Text="{Binding Id}" /&gt;
      &lt;Picker ItemsSource="{Binding RaceList}" ItemDisplayBinding="{Binding Name}" SelectedItem="{Binding RacesIndex, Mode=TwoWay}" /&gt;
      &lt;Label Text="Data Binding 101 Demo" FontAttributes="Bold" HorizontalOptions="Center" /&gt;
      &lt;Label Text="Forename:" /&gt;
      &lt;Entry Text="{Binding Forename, Mode=TwoWay}" /&gt;
      &lt;Label Text="Surname:" /&gt;
      &lt;Entry Text="{Binding Surname, Mode=TwoWay}" /&gt;
      &lt;Label Text="Your forename is:" /&gt;
      &lt;Label Text="{Binding Forename}" /&gt;
      &lt;Label Text="Your surname is:" /&gt;
      &lt;Label Text="{Binding Surname}" /&gt;
    &lt;/StackLayout&gt;
  &lt;/ContentPage&gt;
  </code></pre>
  
  <p>The ViewModel I am using is shown below.</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Threading.Tasks;
  using Newtonsoft.Json;
  using RestSharp;
  using TechsportiseApp.API.Models;
  using Xamarin.Forms;
  using TechsportiseApp.API;
  
  namespace TechsportiseApp.MainUI.Models
  {
  public class RacesViewModel : INotifyPropertyChanged
  {
      int _id;
      public int Id
      {
          get
          {
              return _id;
          }
          set
          {
              if (_id != value)
              {
                  _id = value;
                  OnPropertyChanged("Id");
              }
          }
      }
      string _name;
      public string Name
      {
          get
          {
              return _name;
          }
          set
          {
              if (_name != value)
              {
                  _name = value;
                  OnPropertyChanged("Name");
              }
          }
      }
  
      public List&lt;Race&gt; RaceList
      {
          get
          {
              var racelist = RacesAPI.GetRaces();
              return racelist;
          }
      }
  
      int _racesIndex;
      public int RacesIndex
      {
          get
          {
              return _racesIndex;
          }
          set
          {
              if (_racesIndex != value)
              {
                  _racesIndex = value;
  
                  // trigger some action to take such as updating other labels or fields
                  OnPropertyChanged("RacesIndex");
              }
          }
      }
  
      string forename, surname;
  
      public string Forename
      {
          get
          {
              return forename;
          }
          set
          {
              if (forename != value)
              {
                  forename = value;
                  OnPropertyChanged("Forename");
              }
          }
      }
  
      public string Surname
      {
          get
          {
              return surname;
          }
          set
          {
              if (surname != value)
              {
                  surname = value;
                  OnPropertyChanged("Surname");
              }
          }
      }
  
      public event PropertyChangedEventHandler PropertyChanged;
  
      protected virtual void OnPropertyChanged(string propertyName)
      {
          var changed = PropertyChanged;
          if (changed != null)
              {
                  PropertyChanged(this, new PropertyChangedEventArgs(propertyName));               
              }
      }       
   }
  </code></pre>
  
  <p>In case it is required, here is the code I'm using to populate my list data, which I am obtaining from the JSON response of an API.</p>
  
  <pre><code>using Newtonsoft.Json;
  using RestSharp;
  using System;
  using System.Collections.Generic;
  using System.Text;
  using TechsportiseApp.API.Models;
  using TechsportiseApp.MainUI;
  using Xamarin.Forms;
  
  namespace TechsportiseApp.API
  {
      public class RacesAPI
      {
          public static List&lt;Race&gt; GetRaces()
          {
              var raceList = new List&lt;Race&gt;();
              string APIServer = Application.Current.Properties["APIServer"].ToString();
              string Token = Application.Current.Properties["Token"].ToString();
              var client = new RestClient(APIServer);
              var request = new RestRequest("api/race", Method.GET);
              request.AddHeader("Content-type", "application/json");
              request.AddHeader("Authorization", "Bearer " + Token);
              var response = client.Execute(request) as RestResponse;
              raceList = JsonConvert.DeserializeObject&lt;List&lt;Race&gt;&gt;(response.Content);
              return raceList;
          }
      }
  }
  </code></pre>
  
  <p>Any ideas? I've been trying to crack this for a couple of days now and just can't seem to make it work.</p>