void SpreadSheetViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "Authorized") { if (Authorized) { _database = new SpreadSheetDB(GoogleOAuth2LoginViewModel.OAuth2); ThreadStart start = delegate() { ObservableCollection<BookViewModel> sheets = null; try { Synchronizing = true; _database.Init(); sheets = _database.RetrieveSpreadsheet(); } catch (System.Exception ex) { Console.WriteLine(ex.Message); } if (Application.Current != null) { Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { if (sheets != null) { // deep copy of collection's items created from different thread foreach (var bookitem in sheets) { BookViewModel book = new BookViewModel(_database, bookitem.BookTitle, bookitem.Entry); book.Book.CollectionChanged += book.VocaViewModel_PropertyChanged; foreach (var vocaitem in bookitem.Book) { book.Book.Add(vocaitem); } this.SpreadSheet.Add(book); } // move focus to the last ICollectionView vs = CollectionViewSource.GetDefaultView(this.SpreadSheet); vs.MoveCurrentToLast(); } Synchronizing = false; })); } }; new Thread(start).Start(); } else { } } }