public SteamSelectorViewModel(IEventAggregator eventAggregator, ITileCreator tileCreator) { _tileDataSelectedEvent = eventAggregator.GetEvent <TileDataSelectedEvent>(); _tileDataSelectedEvent.Subscribe(o => { try { _reactingToTileDataSelectedEvent = true; SelectedGameData = o as GameDataViewModel; } finally { _reactingToTileDataSelectedEvent = false; } }); _tileCreator = tileCreator; RefreshCommand = new AsyncRelayCommand(() => Refresh(), null, true); UserData = CacheManager.LoadFromCache <UserData>().FirstOrDefault() ?? new UserData(); SteamAPI = new SteamAPI(UserData.SteamCommunityId); UserData.SteamCommunityIdChanged += async(o, e) => { await UserData.SaveToCacheAsync(); SteamAPI = new SteamAPI(UserData.SteamCommunityId); }; var cachedGameDatas = CacheManager.LoadFromCache <GameData>() .OrderBy(o => o.IsInstalled ? 0 : 1) .ThenBy(o => o.Name) .Select(o => new GameDataViewModel(o, _tileCreator, SteamAPI)); GameDatas.AddRange(cachedGameDatas); GameDatas.CollectionChanged += async(o, e) => { switch (e.Action) { case NotifyCollectionChangedAction.Add: foreach (GameData item in e.NewItems) { await item.SaveToCacheAsync(); } break; case NotifyCollectionChangedAction.Remove: foreach (GameData item in e.OldItems) { await item.RemoveFromCacheAsync(); } break; default: break; } }; Application.Current.Exit += (o, e) => { UserData.SaveToCache(); if (SelectedGameData != null) { SelectedGameData.GameModel.SaveToCache(); } }; }