title: Changing collection, CollectionChanged always null
body: <p>I'm going around in circles trying to figure this out. </p>
  
  <p>I'm swapping out one set of data in a collection for another set of data. My UI which displays the data shows the first set fine on load of the control, but does not change to the new set of data when I change the collection content. </p>
  
  <p>I'm expecting that CollectionChanged in the NotifyCollectionChanged method to have a subscription, but it does not. </p>
  
  <p>StationName shows on my UI on load, but does not change on reload. 
  The StationListOfMovements shows on my UI on load, but does not change on reload. </p>
  
  <p>I can change individual items in the existing collection in code. Where am I going wrong here?</p>
  
  <p><strong>The control which displays the data</strong></p>
  
  <pre><code>public partial class CisArrivalsPanel : UserControl
      {
          private ApiDataArrivalsDepartures _theArrivalsDepartures;
  
          public CisArrivalsPanel()
          {
              InitializeComponent();
  
              _theArrivalsDepartures = new ApiDataArrivalsDepartures();
  
              _theArrivalsDepartures = MakeQuery.LiveTrainArrivals("London Kings Cross"); //load the first set of data into the collection
  
              this.DataContext = _theArrivalsDepartures;
  
              ListBoxArr.ItemsSource = _theArrivalsDepartures.StationMovementList;            
          }
  
  
          //this invokes the data collection reload as a test
          private void StationHeader_OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
          {
              Reload();
  
              Debug.WriteLine(_theArrivalsDepartures.StationName);
              foreach (var a in _theArrivalsDepartures.StationMovementList)
              {
                  Debug.WriteLine(a.OriginName);
                  Debug.WriteLine(a.BestArrivalEstimateMins);
              }
          }
  
          //here I am swapping out the collection contents
          void Reload()
          {
              _theArrivalsDepartures = MakeQuery.LiveTrainArrivals("London Paddington"); //load the second set of data into the collection
  
          }
      }
  </code></pre>
  
  <p><strong>The collection</strong></p>
  
  <pre><code>public class ApiDataArrivalsDepartures : INotifyPropertyChanged
      {
          private string _stationName;
          [JsonProperty(PropertyName = "station_name")]
          public string StationName {
              get
              {
                  return _stationName;
              }
              set
              {
                  _stationName = value;
                  NotifyPropertyChanged("StationName");
              } 
          }
  
          private DateTime _requestTime;
          [JsonProperty(PropertyName = "request_time")]
          public DateTime RequestTime {
              get
              {
                  return _requestTime;
              }
              set
              {
                  _requestTime = value;
                  NotifyPropertyChanged("RequestTime");
              } 
          }
  
          private string _stationCode;
          [JsonProperty(PropertyName = "station_code")]
          public string StationCode {
              get
              {
                  return _stationCode;
              }
              set
              {
                  _stationCode = value;
                  NotifyPropertyChanged("StationCode");
              } 
          }
  
          private ObservableCollection&lt;StationListOfMovements&gt; _stationMovementList;
  
          public ObservableCollection&lt;StationListOfMovements&gt; StationMovementList
          {
              get
              {
                  return _stationMovementList;
              }
              set
              {
                  _stationMovementList = value;
                  NotifyCollectionChanged("StationMovementList");
              }
          }
  
          public event PropertyChangedEventHandler PropertyChanged;
  
          private void NotifyPropertyChanged(string property)
          {
              if (PropertyChanged != null)
              {
                  PropertyChanged(this, new PropertyChangedEventArgs(property));
              }
          }
  
          public event NotifyCollectionChangedEventHandler CollectionChanged;
  
          private void NotifyCollectionChanged(string property)
          {
              if (CollectionChanged != null)
              {
                  CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset,property));    
              }            
          }
      }
  
  
      public class StationListOfMovements : INotifyPropertyChanged
      {
  
          private string _mode;
          [JsonProperty(PropertyName = "mode")]
          public string Mode
          {
              get
              {
                  return _mode;
              }
              set
              {
                  _mode = value;
                  NotifyPropertyChanged("Mode");
              }
          }
  
  
          private string _service;
          [JsonProperty(PropertyName = "service")]
          public string Service {
              get
              {
                  return _service;
              }
              set
              {
                  _service = value;
                  NotifyPropertyChanged("Service");
              } 
          }
  
          private string _trainUid;
          [JsonProperty(PropertyName = "train_uid")]
          public string TrainUid {
              get
              {
                  return _trainUid;
              }
              set
              {
                  _trainUid = value;
                  NotifyPropertyChanged("TrainUid");
              } 
          }
  
          private string _originName;
          [JsonProperty(PropertyName = "origin_name")]
          public string OriginName {
              get
              {
                  return _originName;
              }
              set
              {
                  _originName = value;
                  NotifyPropertyChanged("OriginName");
              } 
          }
  
          private string _destinationName;
          [JsonProperty(PropertyName = "destination_name")]
          public string DestinationName {
              get
              {
                  return _destinationName;
              }
              set
              {
                  _destinationName = value;
                  NotifyPropertyChanged("DestinationName");
              } 
          }
  
          private string _platform;
          [JsonProperty(PropertyName = "Platform")]
          public string Platform {
              get
              {
                  return _platform;
              }
              set
              {
                  _platform = value;
                  NotifyPropertyChanged("Platform");
              }
          }
  
     //This is a long boring class, snipped until....
  
          public event PropertyChangedEventHandler PropertyChanged;
  
          private void NotifyPropertyChanged(string property)
          {
              if (PropertyChanged != null)
              {
                  PropertyChanged(this, new PropertyChangedEventArgs(property));
              }
          }
      }
  </code></pre>
  
  <p><strong>Update1:</strong></p>
  
  <pre><code> /// &lt;summary&gt;
          /// Gets train arrivals for a station
          /// &lt;/summary&gt;
          /// &lt;param name="station"&gt;The station.&lt;/param&gt;
          /// &lt;returns&gt;ApiDataArrivalsDepartures&lt;/returns&gt;
          public static ApiDataArrivalsDepartures LiveTrainArrivals(string station)
          {
  
              string crsCode;
              OvergroundStations.StationDictionary.TryGetValue(station, out crsCode);
  
              //construct url
              var queryUrl = new Uri(string.Format("{0}{1}{2}{3}",ApiBaseUrl,"train/station/",crsCode,"/live_arrivals"));
  
              //get json data from API 
              var jsonString = GetDataFromApi(queryUrl);
  
              //convert to root arrival object
              var arrivals = Deseralise&lt;ApiDataArrivalsDepartures&gt;(jsonString) as ApiDataArrivalsDepartures;
  
              //convert arrivals board data
              if (arrivals != null)
                  arrivals.StationMovementList = Deseralise&lt;ObservableCollection&lt;StationListOfMovements&gt;&gt;(jsonString, "arrivals", "all") as ObservableCollection&lt;StationListOfMovements&gt;;
  
              return arrivals;
          }
  </code></pre>
  
  <p><strong>Update 2:</strong></p>
  
  <pre><code>static object Deseralise&lt;T&gt;(string jsonString, string token1, string token2)
          {
              var deserializeObject = new object();
  
              try
              {
                  var jsonPass1 = JObject.Parse(jsonString).SelectToken(token1).ToString();
  
                  var jsonPass2 = JObject.Parse(jsonPass1).SelectToken(token2).ToString();
  
                  deserializeObject = JsonConvert.DeserializeObject&lt;T&gt;(jsonPass2);
              }
              catch (Exception ex) { }
  
              return deserializeObject;
          }
  </code></pre>