public MapManagementVM( IConnectivityService Network, IMapTransferService MapService, IMapStorageService MapStorage, INotificationService Notifications, [Dispatcher] IScheduler Dispatcher ) { Contract.Requires(Network != null); Contract.Requires(MapService != null); Contract.Requires(MapStorage != null); Contract.Requires(Notifications != null); this.Network = Network; this.MapService = MapService; this.MapStorage = MapStorage; this.FirstActivation() .Subscribe(_ => getMaps.Execute(null)); MapList = getMaps.RegisterAsyncFunction(_ => MapStorage.getAllMaps().Select(m => new MapVM(m))) .SelectMany(vms => vms.ToList()) .ObserveOn(Dispatcher) .CreateCollection(); MapList.ItemsAdded .Subscribe(item => _local_map_register.Add(item.ServerKey, Unit.Default)); MapList.ItemsRemoved .Subscribe(item => _local_map_register.Remove(item.ServerKey)); SelectMap = new ReactiveCommand<MapVM>(vm => !vm.IsDownloading); SelectMap .Select(vm => vm as IElementVM<Map>) .ToMessage(Messenger, MessageContracts.VIEW); SelectMap .Select(_ => Page.Previous) .ToMessage(Messenger); DeleteMap = new ReactiveCommand<MapVM>(vm => !vm.IsDownloading); DeleteMap .Do(vm => MapList.Remove(vm)) .Select(vm => vm.Model) .Where(map => map != null) .Subscribe(map => MapStorage.deleteMap(map)); _IsOnlineAvailable = this.ObservableToProperty( this.OnActivation() .SelectMany(Network.WifiAvailable().TakeUntil(this.OnDeactivation())) .Do(x => { }) , x => x.IsOnlineAvailable, false); SearchMaps = new ReactiveAsyncCommand(_IsOnlineAvailable); _SearchResults = this.ObservableToProperty<MapManagementVM, IReactiveCollection<MapVM>>( SearchMaps.RegisterAsyncFunction(s => searchMapsImpl(s as string)) .ObserveOn(Dispatcher) .Select(result => { try { return new ReactiveCollection<MapVM>(result.Select(x => new MapVM(null) { ServerKey = x })) as IReactiveCollection<MapVM>; } catch (Exception) { return null; } }), x => x.SearchResults); DownloadMap = new ReactiveCommand<MapVM>(vm => canBeDownloaded(vm as MapVM), Observable.Empty<Unit>()); DownloadMap .Where(downloadMap.CanExecute) .CheckConnectivity(Network, Notifications) .Do(vm => vm.IsDownloading = true) .Do(_ => CurrentPivot = Pivot.Local) .Do(vm => MapList.Add(vm)) .Subscribe(downloadMap.Execute); downloadMap.RegisterAsyncObservable(vm => { var vm_t = vm as MapVM; if (vm_t == null) return Observable.Empty<System.Tuple<MapVM, Map>>(); else return MapService.downloadMap(vm_t.ServerKey) .ShowServiceErrorNotifications(Notifications) .Catch((WebException ex) => { Notifications.showNotification(DiversityResources.MapManagement_Message_NoPermissions); return Observable.Empty<Map>(); }) .Select(map => System.Tuple.Create(vm_t, map)); }) .ObserveOn(Dispatcher) .Select(t => { if (t.Item1 != null) // VM { if (t.Item2 != null) // Map { t.Item1.SetModel(t.Item2); } else { MapList.Remove(t.Item1); } } return t.Item1; }).Subscribe(_ => SelectMap.RaiseCanExecuteChanged()); }